FastFiber

fields in een block met attributes

Gestart door MRdesign, di 01 04 2008, 13:26:19

Vorige topic - Volgende topic

MRdesign

Goedemiddag,

Ik heb het volgende probleem:
in mijn tekening heb ik een block gemaakt voor het benoemen van vertrekken met een 3-tal attributen.
1. vertreknummer
2. vertrekomschrijving
3. oppervlakte vertrek

nummer 1 en 2 zijn gewoon handmatig in te voeren maar bij oppervlakte vertrek wil ik dus een field (selecteren van een polyline) ingeven waarbij deze automatisch geupdate wordt als ik de polyline verander.
daarbij komt nog het vervelende feit tevoorschijn dat de m2 niet in m2 wordt weergegeven maar in mm2. dit is uiteraard niet de bedoeling.

Ik heb hier op de site een handig lisp-routine gedownload waarbij je een willekeurige polyline kunt selecteren en dan een willekeurige tekstregel / attribute aan kunt klikken waar de m2 wordt getoond. Dit werkt perfect, alleen niet bij mij ;-). wanneer ik mijn block invul vul ik alleen nummer 1 en 2 in. nummer 3 vul ik niet in (aangezien ik dit dmv een field wil laten invullen). ik kan dus de lisp routine wel gebruiken maar ik heb geen attribute waar ik hem aan kan hangen (niet zichtbaar).

iemand een idee?

hulpje

Wij hebben ook soort gelijke blocken en hebben dat op de volgende manier op "laten" lossen.

Stap 1 - Voeg block in
Stap 2 - Met een routine plaats ik een soort van ruimte naam in het block.
Stap 3 - Met een andere routine ga ik de m² koppelen aan het block. (Waarschijnlijk staat in je Suffix mm² i.p.v. m2)
Stap 4 - Ik laat alle gegevens wegschrijven naar excel.

Ondanks dat het eenvoudig lijkt, hebben wij toch een gespecilialiseerd bedrijf ingeschakeld om voor ons deze routine te laten maken.
Het kost wel iets, maar dan heb je ook wel wat.

Richard


HELAAS BESTAAT CADToppers.com niet meer
ACP-er (AutoDesk Certified Professional)

MRdesign

ik zat er nog eens over na te denken.....

ik heb ergens van deze site de volgende lisp-routine gedownload:

(defun c:AreaReact (/ Sel EntData PolyObj TextObj ReactList Pos TextSel)

;|  Adds a presistant reactor to a polyline object that
    updates a selected text object to the polylines area
    in square feet.  You will have to have the subs loaded
    in everydrawing for it to work, so that it know what
    to do with the reactor, because it is saved with the
    drawing.  Saves the association between the text
    and the polyline in the extension dictionary of the
    polyline.  If the text object is deleted, then the
    program will remove the reactor related to the polyline.
    Thanks to Luis Esquivel for his help and guidance.
    v1.0 2/2006 Tim Willey
    v1.1 5/2006 Added the ability to select an attribute.
|;

(if
(and
  (setq Sel (entsel "\n Select polyline to get area of: "))
  (setq EntData (entget (car Sel)))
  (= (cdr (assoc 0 EntData)) "LWPOLYLINE")
  (setq PolyObj (vlax-ename->vla-object (car Sel)))
  (setq Sel (nentsel "\n Select text of hold area value: "))
  (setq EntData (entget (car Sel)))
  (or
   (if (vl-position (cdr (assoc 0 EntData)) '("TEXT" "MTEXT"))
    (setq TextSel T)
   )
   (= (cdr (assoc 0 EntData))  "ATTRIB")
  )
  (if TextSel
   (if (equal (length Sel) 2)
    T
    (prompt "\n Cannot select nested text.")
   )
   T
  )
  (setq TextObj (vlax-ename->vla-object (car Sel)))
)
(progn
  (PutArea PolyObj TextObj)
  (if
   (and
    (setq ReactList (AssociatedReactors PolyObj))
    (setq Pos (vl-position "MyAreaReactorModified" (mapcar 'vlr-data ReactList)))
   )
   (vlr-remove (nth Pos ReactList))
  )
  (vlr-pers
   (vlr-object-reactor
    (list PolyObj)
    "MyAreaReactorModified"
    '(
     (:vlr-modified . MakeCmdEndReactor)
     (:vlr-erased . ObjectEraseReactor)
;     (:vlr-unerased . ObjectUnErasedReactor)
    )
   )
  )
)
)
(princ)
)
;---------------------------------------------------------------------------------------------------------------
(defun PutArea (PolyObj TextObj / Dict xRec SqFt)

(setq Dict (vla-GetExtensionDictionary PolyObj))
(if (vl-catch-all-error-p (setq xRec (vl-catch-all-apply 'vla-Item (list Dict "MyAreaReactor"))))
(setq xRec (vla-AddXRecord Dict "MyAreaReactor"))
)
(MySetXrec xRec '(40 1) (list (vlax-get PolyObj 'Area) (vlax-get TextObj 'Handle)))
(setq SqFt (/ (vla-get-Area PolyObj) 100000.0))
(vla-put-TextString TextObj (strcat (rtos SqFt 2 2) " m2."))
xRec
)
;----------------------------------------------------------------------------------------------------------------
(defun MakeCmdEndReactor (Obj React NotSure)

(if (not (wcmatch (getvar "cmdnames") "U,UNDO,REDO,OOPS"))
(progn
  (if GlbVarAreaObject
   (setq GlbVarAreaObject (append GlbVarAreaObject (list Obj)))
   (setq GlbVarAreaObject (list Obj))
  )
  (if (not GlbReactorCommandEnd)
   (setq GlbReactorCommandEnd (vlr-command-reactor "tempAreaCommandReactor" '((:vlr-commandEnded . AdjustTextObj))))
  )
)
)
(princ)
)
;------------------------------------------------------------------------------------------------------------------
(defun ObjectEraseReactor (Obj React NotSure)

(vlr-pers-release React)
(vlr-remove React)
)
;-----------------------------------------------------------------------------------------------------------------
(defun ObjectUnErasedReactor (Obj React NotSure)

(vlr-pers
(vlr-object-reactor
  (list Obj)
  "MyAreaReactorModified"
  '(
   (:vlr-modified . MakeCmdEndReactor)
   (:vlr-erased . ObjectEraseReactor)
   (:vlr-unerased . ObjectUnErasedReactor)
  )
)
)
)
;-----------------------------------------------------------------------------------------------------------------
(defun AdjustTextObj (React CommandList / Dict xRec xRecList TextObj)

(foreach Obj GlbVarAreaObject
(if (not (vlax-erased-p Obj))
  (progn
   (setq Dict (vla-GetExtensionDictionary Obj))
   (if (not (vl-catch-all-error-p (setq xRec (vl-catch-all-apply 'vla-Item (list Dict "MyAreaReactor")))))
    (progn
     (setq xRecList (MyGetXRec xRec))
     (if
      (and
       (setq tmpEnt (handent (cdr (assoc 1 xRecList))))
       (setq TextObj (vlax-ename->vla-object tmpEnt))
       (not (vlax-erased-p TextObj))
      )
      (PutArea Obj TextObj)
      (progn
       (foreach i (AssociatedReactors Obj)
        (if (= (vlr-data i) "MyAreaReactorModified")
         (progn
          (vlr-pers-release i)
          (vlr-remove i)
         )
        )
       )
       (prompt "\n Reactor has be removed because the text object has been erased.")
      )
     )
    )
   )
  )
)
)
(setq GlbVarAreaObject nil)
(vlr-remove GlbReactorCommandEnd)
(setq GlbReactorCommandEnd nil)
)
;---------------------------------------------------------------------------
(defun MySetXRec (Obj CodeList DataList / )
; Sets XRecordData. Dxf numbers between 1-369, except 5, 100, 105.
; See help for types and numbers to use.

(vla-SetXRecordData Obj
(vlax-make-variant
  (vlax-safearray-fill
   (vlax-make-safearray
    vlax-vbInteger
    (cons 0 (1- (length CodeList)))
   )
   CodeList
  )
)
(vlax-make-variant
  (vlax-safearray-fill
   (vlax-make-safearray
    vlax-vbVariant
    (cons 0 (1- (length Datalist)))
   )
   DataList
  )
)
)
)
;-----------------------------------------------------------------------------
(defun MyGetXRec (Obj / CodeType DataType)
; Retrive XRecordData for an object

(vla-GetXRecordData
Obj
'CodeType
'DataType
)
(if (and CodeType DataType)
(mapcar
  '(lambda (a b)
   (cons a (variant-value b))
  )
  (safearray-value CodeType)
  (safearray-value DataType)
)
)
)
;-------------------------------------------------------------------------------------
(defun AssociatedReactors (Obj / ReactList)
; Return a list of reactors (object type) associated with an object.
; Use like (AssociatedReactors (vlax-ename->vla-object (car (entsel))))

(foreach i (cdar (vlr-reactors :vlr-object-reactor))
(if (vl-position Obj (vlr-owners i))
  (setq ReactList (cons i ReactList))
)
)
ReactList
)
;---------------------------------------------------------------------------
(defun RemovePersReact ()
; Remove persistant reactors that don't have an owner.

(foreach i (vlr-pers-list)
(if (not (vlr-owners i))
  (progn
   (vlr-pers-release i)
   (vlr-remove i)
  )
)
)
)

Nu heb ik dus totaal geen, en dan echt ook geen, verstand van Lisp-routines schrijven. Is het mogelijk om NA het aanklikken van deze functie het gebied (polyline) te selecteren en daarna het block aan te klikken zodat de hoeveelheid automatisch aan het desbetreffende attribute wordt gehangen? M.a.w. de volgende werkvolgorde :

1. ontwerp maken
2. polyline in de ruimte tekenen
3. block met bouwbesluitgegevens invoegen
4. block gedeeltelijk invullen (nummer en vertrekomschrijving)
HIER STOPT MIJN TEKENWERK BIJ SCHETSONTWERPEN e.d.

Bij uitwerking van schetsontwerp naar boouwaanvraagtekening:
5a. lisp-routine aanklikken
b. polyline aanklikken
c. block aanklikken
====> lisp routine schrijft automatisch gegevens weg naar bijvoorbeeld attribute: OPPERVLAKTE


Kan dit?

FastFiber