Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Dynamischer Block und DCL

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Dynamischer Block und DCL (729 / mal gelesen)
Andi552
Mitglied
CAD-Konstrukteur

Sehen Sie sich das Profil von Andi552 an!   Senden Sie eine Private Message an Andi552  Schreiben Sie einen Gästebucheintrag für Andi552

Beiträge: 6
Registriert: 16.04.2017

autocad mechanical 2015
Inventor 2015

erstellt am: 16. Apr. 2017 21:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Guten Abend!

Da dies mein erster Beitrag ist möchte ich mich kurz vorstellen.
Ich heiße Andreas und arbeite seit 6 Jahren als CAD-Konstrukteur mit verschiedenen CAD-Systemen bislang leider eher selten mit AutoCad.
Mit LISP habe ich mich daher bis jetzt auch nicht beschäftig.

Vor kurzen habe ich die Firma gewechselt und habe gleich die Aufgabe bekommen neben meinen "normalen" Tätigkeiten
einen neuen Schriftkopf sowie Vorlagedatei für unsere AutoCad Zeichnungen zu erstellen.
Der neue Schriftkopf soll über einen selbst programmierten Schriftkopf-Editor ausgefüllt werden können.
Zu diesen Zweck habe ich mir von den einschlägigen Quellen LISP Programme kopiert und gepasst.

Der Editor soll beim öffnen alle Werte der Attribute( z.B. Zeichnungsnummer, Zeichnungstyp,...) vom Schriftkopf des aktuellen Layouts einlesen.
Die Werte anzeigen und nach dem bearbeiten die aktuellen Werte in den Schriftkopf schreiben.
Eine DCL für das Editorfenster habe ich bereits erstellt. Die ersten Attributwerte von einem "normalen" Block konnte ich bereits einlesen
(leider nicht auf das aktuelle Layout beschränkt) und verarbeiten.

Leider musste ich aber jetzt auf einen dynamischen Block umschwenken. Da eine einfache Umschaltung des Formates über zwei lineare Parameter
und eine Blockeigenschaftentabelle sowie eine Umschaltung zwischen einem Schriftkopf für Firmeninternen und externen gebrauch
über einen Sichtbarkeitsparameter gewünscht wurde.

Der Workaround mit den anonymen Blöcken den AutoDesk bei dynamischen Blöcken einsetzt ist mir mittlerweile bekannt trotzdem macht er mir große Probleme.
Mir ist bewusst das diese Problematik schon öfter Thema hier im Forum war und ich habe auch schon viele Beiträge sowie die "FAQ: Blöcke"
durchgelesen nur bin ich leider trotzdem nicht weiter gekommen.
Ich hoffe das Ihr mir helfen könnt den unten angefügten Code zum auslesen der Attributwerte für einen dynamischen Block im aktuellen Layout anzupassen

Lg
Andi

Code:
(defun c:ske (/)


(vl-load-com)
(setq acadDocument (vla-get-activedocument (vlax-get-acad-object)))
(setq ssets (vla-get-selectionsets acadDocument))

(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list ssets "$Set")))

  (setq newsset (vla-add ssets "$Set"))
 
    (progn

    (vla-delete (vla-item ssets "$Set"))

  (setq newsset (vla-add ssets "$Set"))
     
    )

)


(setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 0)))

(setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 0)))

(vlax-safearray-fill filter_code '(2))

(vlax-safearray-fill filter_value '("SK_NEU"))

(vla-select newsset acSelectionSetAll nil nil filter_code filter_value)

  (if (>= (vla-get-count newsset) 1)

    (sk)

    ;if the block is not found
    (alert
      "\Kein Schriftkopf im aktuellen Layout gefunden!
      \nBitte einen Schriftkopf einfügen!"
    )

  )

(princ)

)

(defun sk (/)        


(vl-load-com)


(setq item (vla-item newsset 0))

(setq theatts (vla-getattributes item))

(setq attlist (vlax-safearray->list (variant-value theatts)))

(mapcar 'set '(theattribute1 theattribute2 theattribute3 theattribute4 theattribute5 theattribute6 theattribute7) attlist)


(setq eb3 (vla-get-textstring theattribute1)
  eb7 (vla-get-textstring theattribute2)
  eb9 (vla-get-textstring theattribute3)
  eb10 (vla-get-textstring theattribute4)
  Fertigungsprozess (vla-get-textstring theattribute5)
  Produktionsanlage (vla-get-textstring theattribute6)
  Zeichnungstyp (vla-get-textstring theattribute7)
  )


------------------
_____________
LG
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 16. Apr. 2017 23:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Andi552 10 Unities + Antwort hilfreich

Servus,

Selectionsset Filter - aktuelles Layout
DXF-Gruppencode 410 (Hilfe), dazu noch Sysvar CTAB

Damit schränkst du das ganze auf das aktuelle Layout ein.

Anstatt auf den Blocknamen, schränkst du nur auf den Objekttyp ein, DXF Gruppencode 0,
denn die Blocknamen kennst du ja nicht(die anonymen Namen).

Wenn du dann deinen Auswahlsatz hast, gehe durch alle Objekte durch und prüfe den EFFECTIVENAME, ob dieser "SK_NEU" entspricht.

Falls JA, deiner Trefferliste hinzufügen.. denn es können ja mehrere im Layout sein, auch wenn das nicht sein soll(Warnhinweis für den User).
In deinem Code war dir die Anzahl egal, sollte es aber nicht.

Sollte keine Liste erzeugt worden sein, Warnhinweis: Kein SK_NEU vorhanden.

Mit deinem vla-Auswahlsatz arbeitet man zwar mit anderen Funktionen,
aber damit dieses Posting nicht ganz ohne Code bleibt - technisch der gleiche Ablauf wie vorgeschlagen:

Code:
;Auswahlsatz
(if (setq AWS (ssget "_X" (list'(0 . "INSERT")(cons 410 (getvar "CTAB"))))) ; CTAB siehe Hilfe!
    (progn; durch alle Objekte laufen
(foreach ITEM (vl-remove-if 'listp (mapcar 'cadr (ssnamex AWS)))
        (setq VLAITEM (vlax-ename->vla-object ITEM))
        (if (and ; auf effectivename prüfen
                      (vlax-property-available-p VLAITEM "EFFECTIVENAME")
              (= "SK_NEU" (strcase (vla-get-effectivename VLAITEM)))
            ) ; Wenn der effectivename passt, füge das Objekt meiner Liste hinzu
            (setq BREFLIST (cons ITEM BREFLIST))
        );_if
);_foreach
        (if (< 1 (length BREFLIST))
            (alert "Mehrere SK_NEU gefunden?")
            (progn
              (alert (strcat "Hiermit gehts weiter: " (vl-princ-to-string (car BREFLIST))))  ;Testausgabe
            )
        )
  )
  (alert "Kein SK_NEU vorhanden")
)

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andi552
Mitglied
CAD-Konstrukteur

Sehen Sie sich das Profil von Andi552 an!   Senden Sie eine Private Message an Andi552  Schreiben Sie einen Gästebucheintrag für Andi552

Beiträge: 6
Registriert: 16.04.2017

autocad mechanical 2015
Inventor 2015

erstellt am: 17. Apr. 2017 10:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke für die rasche Antwort!
Ich hätte nicht gedacht dass sich jemand am Ostersonntag die Zeit nimmt um meinen Post zu beantworten.

Dein Einwand das der Editor erkennen soll wenn mehrere Schriftköpfe im Layout sind ist natürlich vollkommen richtig daran hatte ich nicht gedacht.

Ich habe gestern noch die Änderungen am Code gemacht und erhalte nun eine Liste mit den Blockreferenzen.
Leider bin ich mir noch nicht sicher wie ich die Blockreferenzliste nach den Attributwerten durchsuchen soll um Sie anschließend den Variablen zuzuordnen.

Lg
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 17. Apr. 2017 20:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Andi552 10 Unities + Antwort hilfreich

Bei keiner oder mehr wie einer Blockreferenz sollte "abgebrochen" und den User zur Korrektur aufgefordert werden.
Daher benötigst du nur den Zugriff auf das eine einzige Element der Liste mit (car BREFLIST),
dann prüft man auf Vorhandensein von Attributen usw., wie du es bereits hast.

Attribute auslesen hast du in deinem Code bereits drin, ein Beispiel welches sinnvoll den Attributnamen mit ausliest: https://ww3.cad.de/foren/ubb/Forum145/HTML/004427.shtml#000001
Sowas kann man sehr variable als Funktion auslagern, damit ist dann "Attribute auslesen" nur eine Zeile in der Hauptfunktion.

So wie im Link könnte man die Attributwerte gezielt nach Attributnamen ermitteln.
Es gibt aber soo viele Kleinigkeiten die man beschreiben muss/könnte, da ist (m)ein Smartphoneeinsatz ungeeignet.
Hat man eine Liste wie (("ATTNAME" "Attwert" vlaObject)("AT...usw)), so kann man mit ASSOC gezielt die Daten eines Attributes aus der Liste lesen.

Die Woche wirst du noch deutlichere Hilfe bekommen, ganz sicher.

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andi552
Mitglied
CAD-Konstrukteur

Sehen Sie sich das Profil von Andi552 an!   Senden Sie eine Private Message an Andi552  Schreiben Sie einen Gästebucheintrag für Andi552

Beiträge: 6
Registriert: 16.04.2017

autocad mechanical 2015
Inventor 2015

erstellt am: 17. Apr. 2017 21:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke!

Ich werde den von dir verlinkten Beitrag durcharbeiten und hoffe das ich dann eine Lösung finde.

Gestern und heute habe ich bereits etwas mit dem Code von den unten verlinkten Betrag "herumgespielt" (im speziellen mit Test2) und auch einige Erkenntnisse dazugewonnen
aber das gewünschte Ergebnis habe ich leider noch nicht erreicht.
Soweit wie das bis jetzt verstanden habe muss ich aus "BREFLIST" alle Werte die zu ATTRIB gehören nach dem Attributnamen durchsuchen (  ATTRIB mittels ASSOC 0 "filtern"
und den Attributnamen über ASSOC 2) und wenn ich den entsprechenden Wert gefunden habe diesen über ASSOC 1 lesen und an "meine" Variablen übergeben damit ich Werte
wie gehabt über die Edit_Boxen meiner DCL Oberfläche anzeigen lassen kann.

Ich hoffe das ich soweit die Vorgehensweise richtig verstanden habe.

https://ww3.cad.de/foren/ubb/Forum145/HTML/002860.shtml

LG
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 18. Apr. 2017 11:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Andi552 10 Unities + Antwort hilfreich


170418_1.lsp

 
Dein Link zeigt die Attributdatenermittlung über AutoLisp, welches an die DXF-Struktur angelehnt ist,
dies geht auch. Für den Dialog im Forum sollte man sich nun aber auf eine Variante festlegen.

Bleiben wir zur Attributdaten-Ermittlung bei dem urspünglichen Ansatz mit dem vla-Objekt.

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andi552
Mitglied
CAD-Konstrukteur

Sehen Sie sich das Profil von Andi552 an!   Senden Sie eine Private Message an Andi552  Schreiben Sie einen Gästebucheintrag für Andi552

Beiträge: 6
Registriert: 16.04.2017

autocad mechanical 2015
Inventor 2015

erstellt am: 18. Apr. 2017 16:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen lieben Dank!

Das Programm läuft jetzt wieder wie vor der Umstellung auf einen dynamischen Block.
Den von dir geposteten Code muss ich zwar noch gründlich durcharbeiten damit ich Ihn verstehe und ich habe noch einige Baustellen
wie z.B. das Ausgeben der Daten offen aber derzeit zähle ich mich zu den 10 glücklichsten Menschen auf den Planeten!

Lg
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz