(defun LstToString ( lst del / str ) (setq str (car lst)) (foreach itm (cdr lst) (setq str (strcat str del itm))) str );end defun LstToString ;----------------------------- (defun find_entfXref ( / acadapp,archbasedbpref,AECZeichnungseinheitenwert,AECZeichnungseingeiten,blktbllst,lauf,xrefnamelst,anzxref,xrefmeternamelst,xrefEinheitfaktor,XrefUnit,wmatchbedxref,wmatchbedxreflay,testlauf,entfxrefnamelst,entfxrefentlst,laufnew,vorhxref,entfxrefnamestrlen,entfxrefnamelstneu,dul,xrefunload) ;------------------------------------------------------ ;begin ACA Zeichnungeinheiten ermitteln (setq acadapp (vlax-get-acad-object) actdoc (vlax-get acadapp "ActiveDocument") archbasedoc (vlax-invoke acadapp "getinterfaceobject" "AecX.AecArchBaseDocument.8.0")) (vlax-invoke archbasedoc "init" actdoc) (setq archbasedbpref (vla-get-preferences archbasedoc)) (setq AECZeichnungseinheitenwert (vlax-get archbasedbpref "LinearUnit")) (cond ((= AECZeichnungseinheitenwert 25) (setq AECZeichnungseingeiten "Millimeter")) ((= AECZeichnungseinheitenwert 23) (setq AECZeichnungseingeiten "Dezimeter")) ((= AECZeichnungseinheitenwert 2) (setq AECZeichnungseingeiten "Meter")) ((= AECZeichnungseinheitenwert 30) (setq AECZeichnungseingeiten "Fuß")) ((= AECZeichnungseinheitenwert 31) (setq AECZeichnungseingeiten "Zoll")) (t nil) );end cond ; (print "aktuelle ACA-Zeichnungseinheit: ")(princ AECZeichnungseingeiten) ;end ACA Zeichnungeinheiten ermitteln ;------------------------------------------------------ ;begin suche alle Xrefs ; (print "bin in Update_XrefLt: ")(terpri) (setq blktbllst 0) (setq lauf 0) (setq xrefnamelst nil) (setq entfxrefnamelst nil) (while (/= blktbllst nil) (setq blktbllst (tblnext "Block")) ; (print "bin in while-schleife in Update_XrefLt, blktbllst: ")(princ blktbllst)(terpri) (if (and (/= (cdr (assoc 1 blktbllst)) nil);ist Xref (/= (findfile (cdr(assoc 1 blktbllst))) nil);Xref gefunden ) (progn ; (print "Xref gefunden: ")(princ (cdr(assoc 1 blktbllst)))(terpri) (if (= lauf 0) (progn ;----------------------------- ;entfernte Xrefs in Extra-Liste sammeln (if (or (and (= (cdr (assoc 70 blktbllst)) 4);Xref zugeordnet und entfernt oder verschachtelt und nicht gefunden oder nicht refernziert (/= (cdr (assoc 71 (entget(tblobjname "BLOCK" (cdr (assoc 2 blktbllst)))))) nil);Flagbit (71 . 1) -> Xref verschachtelt und entfernt (= (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" (cdr (assoc 2 blktbllst)))))))) nil);Xref verschachtelt, nicht in Zeichnung positioniert );end and (and (= (cdr (assoc 70 blktbllst)) 4);Xref zugeordnet und entfernt oder verschachtelt und nicht gefunden oder nicht refernziert (/= (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" (cdr (assoc 2 blktbllst)))))))) nil);Xref in Zeichnung positioniert );end and (= (cdr (assoc 70 blktbllst)) 12);Xref überlagert und entfernt );end or (progn ; (print "in lauf 0: ")(princ (cdr (assoc 1 blktbllst)))(princ " und findfile ")(princ (findfile (cdr(assoc 1 blktbllst))))(terpri) (setq entfxrefnamelst (list (cdr (assoc 2 blktbllst))));Name von erstem entferntem Xref in Liste sammeln ; (print "Objektname von entferntem Xref: ")(princ (cdr (assoc 331 (entget (cdr (assoc 330 (entget (cdr (assoc -2 blktbllst)))))))))(terpri) ; (print "erstes entferntes Xrefs: ")(princ entfxrefnamelst)(terpri) );end progn );end if ;end entfernte Xrefs in Extra-Liste sammeln ;----------------------------- (setq xrefnamelst (list (cdr (assoc 2 blktbllst))));Name von erstem Xref in Liste sammeln ; (print "Entityliste in Lauf 0: ")(princ blktbllst)(terpri) ; (print "Xrefs in Liste Lauf 0: ")(princ xrefnamelst)(terpri) );end progn );end if = lauf 0 ;----------------------------- (if (> lauf 0) (progn ;----------------------------- ;weitere entfernte Xrefs in Extra-Liste sammeln (if (or (and (= (cdr (assoc 70 blktbllst)) 4);Xref zugeordnet und entfernt oder verschachtelt und nicht gefunden oder nicht refernziert (/= (cdr (assoc 71 (entget(tblobjname "BLOCK" (cdr (assoc 2 blktbllst)))))) nil);Flagbit (71 . 1) -> Xref verschachtelt und entfernt (= (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" (cdr (assoc 2 blktbllst)))))))) nil);Xref verschachtelt, nicht in Zeichnung positioniert );end and (and (= (cdr (assoc 70 blktbllst)) 4);Xref zugeordnet und entfernt oder verschachtelt und nicht gefunden oder nicht refernziert (/= (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" (cdr (assoc 2 blktbllst)))))))) nil);Xref in Zeichnung positioniert );end and (= (cdr (assoc 70 blktbllst)) 12);Xref überlagert und entfernt );end or (progn ; (print "in lauf ")(princ lauf)(princ " -> ")(princ (cdr (assoc 1 blktbllst)))(princ " und findfile ")(princ (findfile (cdr(assoc 1 blktbllst))))(terpri) (if (/= entfxrefnamelst nil) (progn (setq entfxrefnamelst (append (list (cdr (assoc 2 blktbllst)))entfxrefnamelst));Namen von weiteren entfernten Xrefs in Liste sammeln );end progn );end if (if (= entfxrefnamelst nil) (progn (setq entfxrefnamelst (list (cdr (assoc 2 blktbllst))));Name von erstem entferntem Xref in Liste sammeln );end progn );end if ; (print "Objektname von entferntem Xref: ")(princ (cdr (assoc 331 (entget (cdr (assoc 330 (entget (cdr (assoc -2 blktbllst)))))))))(terpri) ; (print "entfernte Xrefs: ")(princ entfxrefnamelst)(terpri) );end progn );end if ;end entfernte Xrefs in Extra-Liste sammeln ;----------------------------- (setq xrefnamelst (append (list (cdr (assoc 2 blktbllst)))xrefnamelst));Namen von weiteren Xrefs in Liste sammeln ; (print "Entityliste in Lauf ")(princ lauf)(princ " :")(princ blktbllst)(terpri) ; (print "Xrefs in Liste Lauf ")(princ lauf)(princ " :")(princ xrefnamelst)(terpri) );end progn );end if > lauf 0 ;----------------------------- (setq lauf (+ lauf 1)) );end progn );end if );end while ; (print "blktbllst: ")(princ blktbllst)(terpri) ;----------------------------- ;nach alle Xrefs neu laden teste ob Xref nicht gefunden (command "-xref" "_r" "*");alle Xrefs neuladen ; (print "bin in teste ob Xref nicht gefunden: ")(terpri) ;----------------------------- ;suche nach Xref nicht gefunden oder nicht refernziert (foreach notfoundxref xrefnamelst (setq entfxrefentlst (entget(tblobjname "BLOCK" notfoundxref)));Entityliste von Xref (if (= (cdr (assoc 70 entfxrefentlst)) 4);nach alle Xrefs neuladen immer noch (70 . 4) -> Xref nicht gefunden oder nicht refernziert (progn (setq missingxref (cdr(assoc 2 entfxrefentlst))) ; (print missingxref)(princ " in Testlauf 2: nicht gefunden")(terpri) ;(CheckXREFnichtGefunden) (setq missingxref nil) );end progn );end if wenn Xref nicht gefunden );end foreach ;end suche nach Xref nicht gefunden oder nicht refernziert ;----------------------------- (setq laufnew 0) (foreach vorhxreflst xrefnamelst (setq vorhxref (entget(tblobjname "BLOCK" vorhxreflst))) (if (/= (cdr (assoc 70 entfxrefentlst)) 4);nach alle Xrefs neuladen nicht (70 . 4) -> ist Xref und Xref gefunden (progn ; (print "vor laufnew =0: ")(princ (cdr (assoc 1 vorhxref)))(princ "und findfile ")(princ (findfile (cdr(assoc 1 vorhxref))))(terpri) ;----------------------------- (if (= laufnew 0) (progn ; (print "Objektname von ehemals entferntem und gefundenem Xref: ")(princ (cdr (assoc 331 (entget (cdr (assoc 330 (entget (cdr (assoc -2 vorhxref)))))))))(terpri) (setq vorhfxrefnamelstnew (list (cdr (assoc 2 vorhxref))));Name von erstem vorhandenem Xref in Liste sammeln ; (print "Entityliste: ")(princ vorhxref)(terpri) );end progn );end if = laufnew 0 ;----------------------------- (if (> laufnew 0) (progn ; (print "in laufnew =")(princ laufnew)(princ ": ")(princ (cdr (assoc 1 vorhxref)))(princ "und findfile ")(princ (findfile (cdr(assoc 1 vorhxref))))(terpri) ; (print "Objektname von entferntem Xref: ")(princ (cdr (assoc 331 (entget (cdr (assoc 330 (entget (cdr (assoc -2 vorhxref)))))))))(terpri) (setq vorhfxrefnamelstnew (append (list (cdr (assoc 2 vorhxref)))vorhfxrefnamelstnew));Namen von weiteren vorhandenen Xref in Liste sammeln ; (print "Entityliste: ")(princ vorhxref)(terpri) );end progn );end if > laufnew 0 ;----------------------------- (setq laufnew (+ laufnew 1)) );end progn );end if ; (print "Liste vorhandenen Xrefs: ")(princ vorhfxrefnamelstnew)(terpri) );end foreach ;----------------------------- (if (/= vorhfxrefnamelstnew nil) (progn (setq anzxref (length vorhfxrefnamelstnew)) ; (print "vorhanden Xrefs in Zeichnung: ")(princ vorhfxrefnamelstnew)(terpri) );end progn );end if ;end suche alle Xrefs ;----------------------------- ;begin suche nur Xrefs mit Blockeinheit "Meter" oder Xrefs mit Blockeinheit "Keine" und Einheitenfaktor 1.0 (if (/= xrefnamelst nil) (progn (setq xrefmeternamelst nil) (command "-layer" "_ma" "Xreftemp" "") (foreach xref vorhfxrefnamelstnew (if (= (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" xref)))))) nil);wenn Xref in Blocktabelle vorhanden aber nicht in Zeichnung eingefügt (progn (if (= AECZeichnungseinheitenwert 2);AECZeichnungseinheitenwert Meter=2 (progn ; (print xref)(princ " zuordnen Meter")(terpri) (command "-XREF" "_a" xref "5000,0" "1" "1" "0");Xref in Zeichnung einfügen );end progn );end if (if (= AECZeichnungseinheitenwert 25);AECZeichnungseinheitenwert Millimeter=25 (progn ; (print xref)(princ " zuordnen Millimeter")(terpri) (command "-XREF" "_a" xref "5000000,0" "1" "1" "0");Xref in Zeichnung einfügen );end progn );end if );end progn );end if (if (/= (cdr (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" xref))))))) nil) (progn (setq xrefEinheitfaktor (getpropertyvalue (cdr (assoc 331 (entget(cdr(assoc 330 (entget(tblobjname "BLOCK" xref)))))))"BlockTableRecord/UnitFactor"));Einheitfaktor Block/Xref ; (print "xrefEinheitfaktor Anfang")(princ xrefEinheitfaktor)(terpri) (if (or (and (= (setq XrefUnit(vla-get-Units (vla-item (vla-get-Blocks(vla-get-activeDocument(vlax-get-acad-Object))) xref))) 6)) (and (= (setq XrefUnit(vla-get-Units (vla-item (vla-get-Blocks(vla-get-activeDocument(vlax-get-acad-Object))) xref))) 0)(= xrefEinheitfaktor 1.0)) );Xrefs mit Blockeinheit Meter=6 oder Xrefs mit Blockeinheit Keine=0 und Einheitfaktor 1.0 (progn (setq xrefmeternamelst (append (list (strcase xref)) xrefmeternamelst));Xrefname von Xrefs mit Einheit Merter=6 zu Liste xrefmeternamelst hinzufügen ; (print ", Xrefname: ")(princ xref)(princ " -> Xref-Einheitenfaktor: ")(princ xrefEinheitfaktor)(princ ", Xref-Blockeinheit: ")(princ XrefUnit)(terpri) ; (print "MeterXrefFilterListe: ")(princ xrefmeternamelst)(terpri) );end progn );end if (if (and (= XrefUnit 0)(= xrefEinheitfaktor 1.0));Xrefs mit Blockeinheit Keine=0 und Einheitfaktor 1.0 (progn ; (print "Xref-Blockeinheit von ")(princ xref)(princ " wird auf Meter umgestellt")(terpri) (vla-put-Units (vla-item (vla-get-Blocks(vla-get-activeDocument(vlax-get-acad-Object))) xref)6);setzt Blockeinheit auf Meter=6 );end progn );end if );end progn );end if );end foreach (if (/= (ssget "_x" (list (cons 8 "Xreftemp"))) nil) (progn (command "_erase" (ssget "_x" (list (cons 8 "Xreftemp"))) "") );end progn );end if (setvar "clayer" "0") (command "_-Purge" "_la" "Xreftemp" "_n") ; (print "Xrefs mit Einheit Meter: ")(princ xrefmeternamelst)(terpri) (setq wmatchbedxref (LstToString xrefmeternamelst ","));String für wcmatch alle Xrefs mit Einheit Meter=6 (setq wmatchbedxreflay (LstToString xrefmeternamelst "|*,"));String für wcmatch alle Layer von Xrefs mit Einheit Meter=6 (setq wmatchbedxreflay (strcat wmatchbedxreflay "|*"));String für wcmatch Xreflayer und am Ende "|*" anfügen ;end suche nur Xrefs mit Blockeinheit "Meter" oder Xrefs mit Blockeinheit "Keine" und Einheitenfaktor 1.0 ;----------------------------- ;----------------------------- ;ehemals entfernte Xrefs wieder entfernen (setq entfxrefnamestrlen 0) (setq entfxrefnamelstneu entfxrefnamelst);übergabe ehemals entfernter Xref-Liste an entfxrefnamelstneu (setq dul 0) (foreach entfxrefnamelstpart entfxrefnamelstneu (if (= (length entfxrefnamelst) 1);wenn nur 1 ehemals entferntes Xref in Liste (progn (setq xrefunload (strcat (car entfxrefnamelstneu)));Name vom ehemals entfernten Xref ; (print "es war nur ein ehemals entferntes Xref in Zeichnung: ")(terpri) (command "-XREF" "_u" xrefunload) (setq entfxrefnamelstneu nil) (setq dul nil) );end progn );end if (while (/= entfxrefnamelstneu nil) ; (print "entfxrefnamestrlen: ")(princ entfxrefnamestrlen)(terpri) ; (print "entfxrefnamelstneu: ")(princ entfxrefnamelstneu)(terpri) (while (<= entfxrefnamestrlen 999);ausführen bis Zeichenanzahl 999 (if (= dul 0) (progn ; (print "dul: ")(princ dul)(terpri) ; (print "noch ")(princ (length entfxrefnamelstneu))(princ " ehemals entfernte Xref in Liste")(terpri) (setq xrefunload (strcat (car entfxrefnamelstneu)));Name von erstem ehemals entfernte Xref in strcat sammeln ; (print "xrefunload: ")(princ xrefunload)(terpri) (setq entfxrefnamelstneu (cdr entfxrefnamelstneu));erstes Element aus Liste ehemals entfernter Xrefs löschen (setq entfxrefnamestrlen (strlen xrefunload)) ; (print "entfxrefnamelstneu: ")(princ entfxrefnamelstneu)(terpri) ; (print "Zeichenanzahl für nächste Bedingung: ")(princ (+ (strlen (car entfxrefnamelstneu)) entfxrefnamestrlen))(princ " Zeichen")(terpri) (if (>= (length entfxrefnamelstneu) 1) (progn (setq dul 1) );end progn );end if );end progn );end if dul=0 (if (/= entfxrefnamelstneu nil) (progn (if (and (= dul 1)(<= (+ (strlen (car entfxrefnamelstneu))(strlen xrefunload)) 999)(> (length entfxrefnamelstneu) 1)) (progn ; (print "dul in =1: ")(princ dul)(terpri) ; (print "noch ")(princ (length entfxrefnamelstneu))(princ " ehemals entfernte Xref in Liste in =1:")(terpri) (setq xrefunload (strcat xrefunload "," (car entfxrefnamelstneu)));wieder Name von erstem ehemals entfernte Xref in strcat sammeln (setq entfxrefnamelstneu (cdr entfxrefnamelstneu));wieder erstes Element aus Liste ehemals entfernter Xrefs löschen (setq entfxrefnamestrlen (strlen xrefunload)) ; (print "entfxrefnamelstneu =1: ")(princ entfxrefnamelstneu)(terpri) ; (print "Zeichenanzahl für nächste Bedingung =1: ")(princ (+ (strlen (car entfxrefnamelstneu)) entfxrefnamestrlen))(princ " Zeichen")(terpri) );end progn );end if dul=1 und Anzahl entfxrefnamelstneu >1 ;----------------------------- (if (and (= dul 1)(<= (+ (strlen (car entfxrefnamelstneu))(strlen xrefunload)) 999)(= (length entfxrefnamelstneu) 1)) (progn ; (print "dul in =11: ")(princ dul)(terpri) (setq xrefunload (strcat xrefunload "," (car entfxrefnamelstneu)));wieder Name von erstem ehemals entfernte Xref in strcat sammeln (setq entfxrefnamelstneu (cdr entfxrefnamelstneu));wieder erstes Element aus Liste ehemals entfernter Xrefs löschen -> entfxrefnamelstneu wird nil -> Ende 1. While-Schleife (setq entfxrefnamestrlen (strlen xrefunload)) ; (print "entfxrefnamelstneu =11: ")(princ entfxrefnamelstneu)(terpri) ; (print "Zeichenanzahl für letzte Bedingung =11: ")(princ entfxrefnamestrlen)(princ " Zeichen")(terpri) (command "-XREF" "_u" xrefunload) (setq entfxrefnamestrlen 1000) (setq dul nil) );end progn );end if dul=1 und Anzahl entfxrefnamelstneu =1 ;----------------------------- (if (/= entfxrefnamelstneu nil) (progn (if (and (= dul 1)(>= (+ (strlen (car entfxrefnamelstneu))(strlen xrefunload)) 999)) (progn ; (print "setze dul auf 0 zurück: ")(terpri) ; (print "Zeichenanzahl der zu entfernenden Xrefs wäre: ")(princ (+ (strlen (car entfxrefnamelstneu))(strlen xrefunload)))(terpri) ; (print "xrefunload: ")(princ xrefunload)(terpri) (setq dul 0) (command "-XREF" "_u" xrefunload) );end progn );end if );end progn );end if /= entfxrefnamelstneu nil );end progn );end if entfxrefnamelstneu nicht nil );end while <= entfxrefnamestrlen 999 );end while entfxrefnamelstneu nil );end foreach ;----------------------------- (setq Ltentlist nil) (setq abbruch nil) );end progn );end if (print "alle vorhanden Xrefs in Zeichnung: ")(princ vorhfxrefnamelstnew)(terpri) (print "entfernte Xrefs: ")(princ entfxrefnamelst)(terpri) (print "alle Xrefs mit Einheit Meter: ")(princ xrefmeternamelst)(terpri) (print "Wmatchbedingung Xrefs: ")(princ wmatchbedxref)(terpri) (print "Wmatchbedingung Xreflayer: ")(princ wmatchbedxreflay)(terpri) ; (print "verlasse Update_XrefLt")(terpri) );end defun Update_XrefLt ;----------------------------- (find_entfXref)