| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY präsentiert die PRO Elite™ High Endurance microSD-Flash-Speicherkarten für Videoüberwachung und kontinuierliche Aufzeichnung, eine Pressemitteilung
|
Autor
|
Thema: Dynamische Parameter in Blockdefinitionen ändern (2393 mal gelesen)
|
Andreas Kraus Ehrenmitglied Elektrotechniker
    
 Beiträge: 1500 Registriert: 11.01.2006 WIN 11 ACAD 2022 BricsCAD V25.1.07
|
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: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 03. Jul. 2013 11:22 <-- editieren / zitieren --> Unities abgeben:          Nur für Andreas Kraus
|
Andreas Kraus Ehrenmitglied Elektrotechniker
    
 Beiträge: 1500 Registriert: 11.01.2006 WIN 11 ACAD 2022 BricsCAD V25.1.07
|
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: 22497 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: 22497 Registriert: 03.06.2002 Alles
|
erstellt am: 03. Jul. 2013 16:40 <-- editieren / zitieren --> Unities abgeben:          Nur für Andreas Kraus
|
Andreas Kraus Ehrenmitglied Elektrotechniker
    
 Beiträge: 1500 Registriert: 11.01.2006 WIN 11 ACAD 2022 BricsCAD V25.1.07
|
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: 1998 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 Ehrenmitglied Elektrotechniker
    
 Beiträge: 1500 Registriert: 11.01.2006 WIN 11 ACAD 2022 BricsCAD V25.1.07
|
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 Ehrenmitglied Elektrotechniker
    
 Beiträge: 1500 Registriert: 11.01.2006 WIN 11 ACAD 2022 BricsCAD V25.1.07
|
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 Ehrenmitglied Elektrotechniker
    
 Beiträge: 1500 Registriert: 11.01.2006 WIN 11 ACAD 2022 BricsCAD V25.1.07
|
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 |