| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Dynamische Parameter in Blockdefinitionen ändern (2247 mal gelesen)
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 02. Jul. 2013 14:45 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, mit vla-getdynamicblockproperties komm ich ja an die "dynamischen Einstellungen" eines Inserts ran. Aber wie komm ich an die "Originale", also die Parameter in der Blockdefinition. Ich hab hier viiiiiele Blockdefinitionen deren Skalierung ich anpassen muss. Die Objekte in den Blockdefinitionen bekomme ich wenn ich die Definition durchlaufe, aber alles was dynamisch ist bekomm ich damit nicht. Weis jemand wo das versteckt ist ? Oder gibt's eine andere Möglichkeit Blockdefinitionen zu skalieren ? Und ich befürchte dass ich auch noch den Basispunkt anpassen darf, also Blockdefinition schieben kommt sicher auch noch. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 03. Jul. 2013 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Kraus
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 03. Jul. 2013 12:14 <-- editieren / zitieren --> Unities abgeben:
Nö, da geht's ja darum die dynamischen Parameter eines Inserts zu ändern. Ich möchte (muss) die Parameter und Aktionen in der Blockdefinition ändern. Ein vlax-dump-object mit so einem Parameter hat mir auch nix gebracht. Da steht zwar alles drin was ich so zum Ändern brauche, aber ohne Anklicken find ich die Parameter immer noch nicht. Die Frage ist : wo sind die versteckt ? ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Jul. 2013 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Kraus
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 03. Jul. 2013 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Kraus
|
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Jul. 2013 16:40 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Kraus
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 04. Jul. 2013 08:22 <-- editieren / zitieren --> Unities abgeben:
Hm... irgendwie passt das noch nicht. Wenn ich mir die Daten von vlax-dump-object anschaue bekomme ich bei einem Parameter zB. das hier: ; IAcadBlockLinearParameterEntity: IAcadBlockLinearParameterEntity-Schnittstelle ; Eigenschaftswerte: ; Angle (RO) = 0.0 ; Application (RO) = #<VLA-OBJECT IAcadApplication 00000001401f8ca0> ; BaseLocation = 1 ; BasePoint = (-5.0 5.0 0.0) ; ChainActions = 0 ; Distance = 10.0 ; DistanceDesc = "41" ; DistName = "Länge" ; Document (RO) = #<VLA-OBJECT IAcadDocument 00000000029c45f0> ; EndPoint = (5.0 5.0 0.0) ; Grips = 1 ; Handle (RO) = "D22" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0000000031dee028> ; LabelDist = 1.0 ; Layer = "0" ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; Name = "x" ; ObjectID (RO) = 97 ; ObjectID32 (RO) = 97 ; ObjectName (RO) = "AcDbBlockLinearParameterEntity" ; OwnerID (RO) = 46 ; OwnerID32 (RO) = 46 ; PlotStyleName = "ByLayer" ; ShowProperties = -1 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 0000000031dee440> ; ValueSetIncrement = Ausnahmefehler aufgetreten ; ValueSetList = Ausnahmefehler aufgetreten ; ValueSetMax = 0.0 ; ValueSetMin = 0.0 ; ValueSetType = 0 ; Visible = -1 ; Unterstützte Methoden: ; ArrayPolar (3) ; ArrayRectangular (6) ; Copy () ; Delete () ; GetBoundingBox (2) ; GetExtensionDictionary () ; GetXData (3) ; Highlight (1) ; IntersectWith (2) ; Mirror (2) ; Mirror3D (3) ; Move (2) ; Rotate (2) ; Rotate3D (3) ; ScaleEntity (2) ; SetXData (2) ; TransformBy (1) ; Update () und bei einer Aktion zB. das: ; IAcadBlockStretchActionEntity: IAcadBlockStretchActionEntity-Schnittstelle ; Eigenschaftswerte: ; ActionType (RO) = "Strecken" ; AngleOffset = 0.0 ; Application (RO) = #<VLA-OBJECT IAcadApplication 00000001401f8ca0> ; Coordinate = ...Indizierter Inhalt wird nicht angezeigt... ; Coordinates = (7.34353 8.05502 -7.27577 0.547865) ; DistanceMultiplier = 1.0 ; DistanceType = 0 ; Document (RO) = #<VLA-OBJECT IAcadDocument 00000000029c45f0> ; Handle (RO) = "D2C" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0000000031de8208> ; Layer = "0" ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; Name = "Strecken2" ; ObjectID (RO) = 98 ; ObjectID32 (RO) = 98 ; ObjectName (RO) = "AcDbBlockStretchActionEntity" ; OwnerID (RO) = 46 ; OwnerID32 (RO) = 46 ; PlotStyleName = "ByLayer" ; Position = (-11.7458 5.05216 0.0) ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 0000000031dedf60> ; Visible = -1 ; Unterstützte Methoden: ; ArrayPolar (3) ; ArrayRectangular (6) ; Copy () ; Delete () ; GetBoundingBox (2) ; GetExtensionDictionary () ; GetXData (3) ; Highlight (1) ; IntersectWith (2) ; Mirror (2) ; Mirror3D (3) ; Move (2) ; Rotate (2) ; Rotate3D (3) ; ScaleEntity (2) ; SelectionSet () ; SetSelectionSet (1) ; SetXData (2) ; TransformBy (1) ; Update ()
Da lässt sich was damit anfangen. Aber über "ACAD_ENHANCEDBLOCK" und auslesen der Objekte bekomme ich nur sowas: ; IAcadObject: Die Vorgabe-Schnittstelle für ein AutoCAD-Basisobjekt ; Eigenschaftswerte: ; Application (RO) = #<VLA-OBJECT IAcadApplication 00000001401f8ca0> ; Document (RO) = #<VLA-OBJECT IAcadDocument 00000000029c45f0> ; Handle (RO) = "C22" ; HasExtensionDictionary (RO) = 0 ; ObjectID (RO) = 54 ; ObjectID32 (RO) = 54 ; ObjectName (RO) = "AcDbBlockLinearParameter" ; OwnerID (RO) = 96 ; OwnerID32 (RO) = 96 ; Unterstützte Methoden: ; Delete () ; GetExtensionDictionary () ; GetXData (3) ; SetXData (2) Das sieht anders aus. Da ist doch nix was man ändern kann, keine Koordinaten usw. und das sind auch ganz andere Objekte.
Raff ichs nicht oder was ? Oder muss ich irgendwie über die ObjectIDs weiter ? ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 04. Jul. 2013 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für Andreas Kraus
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 04. Jul. 2013 09:19 <-- editieren / zitieren --> Unities abgeben:
Nö, die Beispiele lesen die Parameter von Inserts aus, die brauch ich ja nicht. Ich hab mir jetzt überlegt ob ich vielleicht über den Blockeditor und (ssget "x") auf alle Objekte in einer Definition zugreife und dann die Änderungen mache (mit "command" und so). Dauert zwar etwas länger, aber immer noch besser als zu Fuß. Mit (ssget "x") bekomm ich nämlich alle Objekte in der Definition (habs getestet) ich muss das nur noch funktionierend zusammenschrauben. Dauert aber noch, jetzt hab ich erst was anderes zu tun. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 04. Jul. 2013 13:28 <-- editieren / zitieren --> Unities abgeben:
So, jetzt hab ichs Mit diesem kleinen Codeschnipsel bekomme ich eine Liste mit ALLEN Objekten in den Blockdefinitionen (auch Parameter und Aktionen) Muss ich dann nur noch abarbeiten. Code:
(defun k_satz->entlist (satz) (if (= (type satz) 'PICKSET) (vl-remove-if-not '(lambda (dummy) (= (type dummy) 'ENAME)) (mapcar 'cadr (ssnamex satz)) ) ) ) (defun get_blkhandles (blocknamen_list / obj_list) (foreach blk blocknamen_list (command "-bedit" blk) (setq obj_list (cons (list blk (mapcar 'vla-get-handle (mapcar 'vlax-ename->vla-object (k_satz->entlist (ssget "x")) ) ) ) obj_list ) ) (command "_u") ) obj_list )
blocknamen_list enthält eine Liste der Blocknamen als Zeichenketten. Alles was im Blockeditor nicht zu bearbeiten geht bitte rausfiltern, also unbenannte, Layouts, usw., sonst Fehlermeldung.
Wenn ichs fertig hab stell ichs hier rein. Wird wahrscheinlich erst Montag. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de [Diese Nachricht wurde von Andreas Kraus am 04. Jul. 2013 editiert.] [Diese Nachricht wurde von Andreas Kraus am 04. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 WIN 10 ACAD 2022
|
erstellt am: 08. Jul. 2013 08:30 <-- editieren / zitieren --> Unities abgeben:
Ich bin ein Wenig weiter gekommen. Es nutzt nix die Handles zu ermitteln und später abzuarbeiten, weil die Parametzer und Aktionen nach Schließen des Blockeditors nicht mehr da sind. Die werden wohl nur zur Laufzeit des Blockeditors erzeugt aber ganz woanders hergeholt. Auch egal. Dann muss man eben die Objekte direkt im Blockeditor bearbeiten. Ich hab mal was angefangen, bin aber noch nicht sehr weit gekommen (das Wetter was so schön, da setz ich mich doch nicht vor den Rechner ) aber mal so als Anfang wie ich mir das gedacht hab. Code: (defun k_satz->entlist (satz) (if (= (type satz) 'PICKSET) (vl-remove-if-not '(lambda (dummy) (= (type dummy) 'ENAME)) (mapcar 'cadr (ssnamex satz)) ) ) )(defun k_liste->variant (liste typ) ;;; erstellt aus einer Koordinatenliste einen Variant (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray 5 (cons 0 (1- (length liste))) ) liste ) typ ) ) (defun work_blkscale (blocknamen_list) (foreach blk blocknamen_list (command "-bedit" blk) (foreach obj_name (mapcar 'vlax-ename->vla-object (k_satz->entlist (ssget "x")) ) (cond ((= (vla-get-ObjectName obj_name) "AcDbBlockLinearParameterEntity" ) (vla-put-BasePoint obj_name (k_liste->variant (mapcar '* (VLAX-SAFEARRAY->LIST (variant-value (vla-get-BasePoint obj_name)) ) (list faktor faktor faktor) ) 8197 ) ) (vla-put-EndPoint obj_name (k_liste->variant (mapcar '* (VLAX-SAFEARRAY->LIST (variant-value (vla-get-EndPoint obj_name)) ) (list faktor faktor faktor) ) 8197 ) ) (vlax-put-property obj_name 'LabelDist (* (vlax-get-property obj_name 'LabelDist) faktor) ) (vlax-put-property obj_name 'ValueSetMax (* (vlax-get-property obj_name 'ValueSetMax) faktor) ) (vlax-put-property obj_name 'ValueSetMin (* (vlax-get-property obj_name 'ValueSetMin) faktor) ) ) (t (print (vla-get-ObjectName obj_name)) (if (vlax-method-applicable-p obj_name 'ScaleEntity) (progn (vla-ScaleEntity obj_name (vlax-3d-point '(0 0 0)) faktor ) ) ) ) ) ) (command "_bclose" "") ) obj_list )
Nach dem cond müssen noch alle möglichen Parameter und Aktionen eingefügt und abgearbeitet werden und ein Error-Handler ist auch noch nicht drin. Ich hab erst mal einen Linearen Parameter soweit fertig. Funktioniert auch. Alles weitere kommt nach und nach. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |