In een eerder artikel is het Field object al besproken. Een Field is een stukje tekst waarin verwezen wordt naar een waarde, bijvoorbeeld de lengte van een lijn of de naam van de tekening. Je kunt het ook gebruiken om bijvoorbeeld de oppervlakte van een polylijn te plaatsen. Om te voorkomen dat je al die handelingen keer op keer opnieuw moet doen, kun je ook een stukje Lisp schrijven die het voor je doet.

Het resultaat is dan dit:

Lisp

Naast een stukje Lisp heb je ook een symbool nodig met twee attributen: één voor het nummer en één voor de oppervlakte. De Lisp-routine ziet er als volgt uit:

(vl-load-com) 

; Subroutine: "subopp" berekent de oppervlakte van een gesloten veld
(defun subopp ()
  (setq ent nil)
  (setq oppvlak nil)
  (setq punt nil)

  (setq ent (entsel "\nSelecteer gesloten omtrek: ")) 
  
  (if (/= ent nil)
    (progn
      (setq oppvlak (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " 
        (itoa (vla-get-ObjectId (vlax-ename->vla-object (car ent)))) 
        ">%).Area \\f \"%lu2%pr0%ps[, m²]\">%"))
      (setq punt (getpoint "\nGeef punt waar tekst geplaatst moet worden: "))
    )
  )
)

; Hoofdroutine
(defun C:OPPV ()
  (setq varScaleFactor (/ 1 (getvar "CANNOSCALEVALUE")))
  (setq varBlockName "SKG-PERCEEL_OPPERVLAK-SO")
  
  (while (< nil (subopp))
    (progn
      (if (= nil percnr)
          (setq percnr 0))
      (setq percnr (+ percnr 1))
      (princ "\nGeef nummer: <")
      (princ percnr)
      (setq inp_nr (getint "> "))
      (if (/= inp_nr nil)
          (setq percnr inp_nr))
      (command "_insert" varBlockName punt varScaleFactor varScaleFactor "0" percnr oppvlak)
    )
  )
  (princ)
)

In plaats van Lisp kun je dit ook met Dynamo voor Civil 3D doen, of in C# iets programmeren. Maar Lisp is hier eenvoudig en snel genoeg. Uiteraard zijn er talloze manieren hoe je de code schrijft en kun je, als je handig bent met Lisp, nog diverse verbeteringen aanbrengen.