| |
| 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 neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Schriftfeld auf Block/Attributen ermitteln (1848 mal gelesen)
|
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 14. Aug. 2015 12:01 <-- editieren / zitieren --> Unities abgeben:
Hallo ! hoffe Ihr könnt mir helfen habe hier einmal ein Lisp Programm gefunden wo man die Schriftfelder auslesen konnte Nun haben wir aber Autocad2013 drauf und irgendwie passt beim Programm was nicht Er ermittelt mir bei mehreren Schriftfeldern in einer Formel nicht mehr alle Schriftfelder Bei wenigen funktionierts aber witzigerweise aber trotzdem wieder... Kann mir da bitte irgendwer helfen?? Siehe Anhang
;;Updated Macro to Get the Field Code from Texts, MTexts and also ATTRIBUTES (not available by Autodesk). ;;Thanks to tlindal for the get ObjectId part of the code. ;;The problem with original code was it didn't work for nested fields like fields with formulas. ;;You can use the same technique as the original code to use the Lisp Macro in VBA. Fieldcode.Lsp ;;;Code starts here ;; GetFieldCode Function ;; By: Hossein Najmi ;; Date: Jul 2005 ;; last updated: Dec 2005 ;; Changed to retrive all children field codes (defun C:f2t (/ ent fldObj) ;; get the entity (setq ent (entget (car (nentsel)))) (princ "\n") ;; get the parent field object (if (/= (assoc '360 ent) nil) (progn (setq fldObj (entget (cdr (assoc '360 (entget (cdr (assoc '360 (entget (cdr (assoc '360 ent))) ) ) ) ) ) ) ) ;; run GetFieldCode function to iterate through all field children ;; and retrieve the field code using recursion technique (setq fldtxt (GetFieldCode fldObj)) ;;(princ fldtxt) ) ) ;;(princ) ) ;; function to get the field code from a FIELD object and ;; from all the children it may have (defun GetFieldCode (fldObj / tmp fldtxt fldCounter subFldTxt fldNo subFldObj fldList ) ;; get the field pattern string (setq fldtxt (cdr (assoc '2 fldObj))) (setq fldCounter 0) ;; number of fields (setq fldNo (cdr (assoc '90 fldObj))) ;; filter the list of field entities (setq fldList (vl-remove-if 'null (mapcar '(lambda (a) (if (= (car a) 360) a ) ) fldObj ) ) ) ;; loop to the number of fields (while (< fldCounter fldNo) ;; part of the field string to be replaced (setq tmp (strcat "\\_FldIdx " (itoa fldCounter))) (setq subFldObj (entget (cdr (nth fldCounter fldList)))) ;; get the actual field string for each sub field (setq subFldTxt (if (= 0 (cdr (assoc '90 subFldObj))) (cdr (assoc '2 subFldObj)) (GetFieldCode subFldObj) ) ) ;; get the ObjectId if there is any refernce to an Object (if (/= (assoc '331 (entget (cdr (nth fldCounter fldList)))) nil ) (progn (setq subFldOid (strcat "ObjId " (itoa (vla-get-ObjectID32 (vlax-ename->vla-object (cdr (assoc '331 (entget (cdr (nth fldCounter fldList))) ) ) ) ) ) ) ) ;; insert the ObjectId in the code (setq subFldTxt (vl-string-subst subFldOid "ObjIdx 0" subFldTxt) ) ) ) ;; replace subfield code in the text string (setq fldtxt (vl-string-subst subFldTxt tmp fldtxt)) (setq fldCounter (1+ fldCounter)) ) (setq output fldtxt) ) ;;; Code ends here Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 14. Aug. 2015 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
Ich mache es jetzt nicht, aber ich vermute das man das Problem sehr leicht sehen würde wenn man sich die Objektedaten mal ansehen würde ? Meine Annahme: Bei "zu langen" Einträgen wird es auf mehrere DottedPairs gesplittet, ist bei Mtexten ja auch so. Das Programm, ohne nachzusehen, wird wohl nur den ersten Assoc-Treffer auswerten. -
(setq fldtxt (cdr (assoc '2 fldObj))) Die Evalution einer Zahl durch quoten zu unterdrücken bringt zeitlich nichts und am Ergebnis ändert sich ja eh nichts.
(if (/= (assoc '360 ent) nil) irgendwas) dürfte wohl auch einfach das bedeuten: (if (assoc 360 ent) irgendwas) (setq fldList (vl-remove-if 'null (mapcar '(lambda (a) (if (= (car a) 360) a)) fldObj))) ein schöne Art um dies auszudrücken: (setq fldList (vl-remove-if-not '(lambda(a)(= (car a) 360))fldObj))
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 13:23 <-- editieren / zitieren --> Unities abgeben:
Das Problem ist nur ich habe in Lisp leider keine Ahnung wie ichs da mach da ich das Feld ja nur im VBA übernehme... Hat da wer was wie ich die Felder in VBA übernehmen könnte und gegebenenfalls dort weiterbearbeiten kann?? Mfg Christian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 19. Aug. 2015 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
Frag den Ersteller, der dürfte als Einziger sein der es nicht nutzen muß und ein Interesse daran haben könnte. Gegenfrage: Warum setzt du es nicht einfach selbst in VBA um? Wenn VBA das Werkzeug deiner Wahl ist.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 13:35 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 19. Aug. 2015 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
|
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 13:48 <-- editieren / zitieren --> Unities abgeben:
Danke vielmals für deine Mühen! Und ich habe den Autor bereits angeschrieben nur noch keine Antwort erhalten wenn ich überhaupt eine erhalte Erstelldatum war ja doch 2005!!! und zuletzt war dieser 2011 online bei seinem Profil.... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3067 Registriert: 26.08.2002 ACAD R11 - 2018.1.2 (Plant3D) AVIS ACAD LT 2013- 2020 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 19. Aug. 2015 13:56 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
|
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 14:18 <-- editieren / zitieren --> Unities abgeben:
Hi Im Endeffekt benötige ich die Objectids und die Operatoren (+/-) weil ich da die Polylinien dann einschraffiere und je nach Operatoren einfärble.. deshalb benötige ich da den Schriftfeldcode Diesen Code mit den Objectids würde ich benötigen %<\AcExpr ((round(%<\_FldPtr 2822932688>%*100)/100-round(%<\_FldPtr 2823012464>%*100)/100-round(%<\_FldPtr 2823016016>%*100)/100-round(%<\_FldPtr 2823001040>%*100)/100-round(%<\_FldPtr 2823010832>%*100)/100-round(%<\_FldPtr 2822995472>%*100)/100-round(%<\_FldPtr 2822990576>%*100)/100-round(%<\_FldPtr 2822932112>%*100)/100-round(%<\_FldPtr 2822941232>%*100)/100-round(%<\_FldPtr 2822933456>%*100)/100-round(%<\_FldPtr 2822990000>%*100)/100)*1) \f "%lu2%pr2">% Anbei auch eine Bespielszeichnung einmal wo der Block auslesbar ist und einmal eben wo es nicht geht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3067 Registriert: 26.08.2002 ACAD R11 - 2018.1.2 (Plant3D) AVIS ACAD LT 2013- 2020 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 19. Aug. 2015 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
Nochmal von vorne du willst eigentlich nur Zuzug bzw Abzugsflächen Schraffieren und hast laut Sysinfo ADT 2013 ? das sollte anderst gehen selbst Soficad hat vor 20 Jahren das auf unterschiedliche Layer gelegt cu cw ------------------ Also ich finde Unities gut ... und andere sicher auch ------------------------------------------------ cadwomen™ Plant ist wie Öl suchen, je tiefer man bohrt desto mehr kommt ans Tageslicht Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 14:26 <-- editieren / zitieren --> Unities abgeben:
Wir verwenden vom Adt2013 aber nur das blanke Autocad!! Sage ich gleich von vornherein! Das zusammenzählen und abziehen funktioniert so eh gut nur eben nicht die Anzeige was welches Feld ist (zur Kontrolle) Und ich will keine spezielle Sonderlösung weil man soll auch beim Standart Autocad die Raumflächen nachziehen können Wir hatten schon mal ein solches Programm ohne Verwendung von Schriftfeldern und das jetzt funktioniert dann auch ohne unseren Aufsatz bzw wenn man ändern möchte! Mfg Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 19. Aug. 2015 16:19 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
Teste mal nach Korrektur wie folgt (beachte die ";" zum auskommentieren im Code, aber besten die Passagen via C&P übernehmen)Code:
;;;Code starts here;; GetFieldCode Function ;; By: Hossein Najmi ;; Date: Jul 2005 ;; last updated: Aug 2015 / cad.de - Fieldcodes with excess length, now accepted. ;; Changed to retrive all children field codes schnipp ;; get the field pattern string ;(setq fldtxt (cdr (assoc '2 fldObj))); auskommentiert/ersetzt (setq fldtxt (apply 'strcat (mapcar 'cdr (vl-remove-if-not'(lambda(dp)(member (car dp) '(2 3))) fldObj)))) schnipp ;; get the actual field string for each sub field (setq subFldTxt (if (= 0 (cdr (assoc '90 subFldObj))) ;(cdr (assoc '2 subFldObj)); auskommentiert/ersetzt (apply 'strcat (mapcar 'cdr (vl-remove-if-not'(lambda(dp)(member (car dp) '(2 3))) subFldObj))) (GetFieldCode subFldObj) ) ) schnipp
Teste es gewissenhaft, ich habe es nicht getan Nicht das hinterher die Reihenfolge der Objekte und Operatoren nicht mehr stimmt ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 16:46 <-- editieren / zitieren --> Unities abgeben:
Funktioniert perfekt Danke Danke Danke! Wenns zuviele sind kratzt mir der zwar ab aber i denk das wird wohl ein anderes Problem sein! Die Anbindung von VBA zu Autocad 2013 is ja leider mehr als dürftig...vor allem was stabilität betrifft! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 19. Aug. 2015 16:53 <-- editieren / zitieren --> Unities abgeben: Nur für c.schojer
F2T in Acad starten -> kratzt nicht ab, dann ein Problem im VBA-Teil, ansonsten noch mal melden. Habe die 1.DWG oben genutzt für den Test! Wenn es im LSP Teil abkratzt und ich das in deiner letzten nachvollziehen kann, dann schaue ich noch mal. Was hapert, lsp oder erst vba ? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
c.schojer Mitglied
Beiträge: 299 Registriert: 23.05.2007 ADT2013
|
erstellt am: 19. Aug. 2015 16:57 <-- editieren / zitieren --> Unities abgeben:
Du i glaubs Autocad hat da nurn Spinner gehabt der Fehler ist leider nicht nachvollziehbar hab das nun mit 45 Objekten probiert und das ging tadellos! Deine Korrekturen funktionieren 1A!!!! Mfg Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |