| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: For each-Schleife (430 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 13. Jan. 2011 08:07 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, ich verwende den Code unten um alle meine Blockreferenzen in einem bestimmten Layout aus zufiltern. Das klappt gut, ist aber sehr langsam. Hat jemand eine Idee wie es schneller ginge. Auch kleine Verschnellerungen wären schon von Vorteil weil der Code oft abläuft. Public Sub Aktuell() Dim xtypeOut As Object Dim xdataOut As Object Dim Bezeichnung As AcadBlockReference Dim Attrib As Object Dim i As Integer Dim A As Integer Dim B As Integer Dim Entity As AcadEntity Dim Thing(0) As AcadEntity sstext = ThisDrawing.SelectionSets.Add("111") For Each Entity In ThisDrawing.ActiveLayout.Block If Entity.ObjectName = "AcDbBlockReference" Then Try Entity.GetXData("", xtypeOut, xdataOut) If Strings.UCase(xdataOut(0)) = "HERMANNSBEZEICHNUNG" Then Thing(0) = Entity sstext.AddItems(Thing) End If Catch ex As Exception End Try End If Next Entity Ich habe auch schon folgendes verwendet: FilterType(0) = 0 FilterData(0) = "INSERT" FilterType(1) = 1001 FilterData(1) = "HermannsBezeichnung" sstext.Delete() sstext = ThisDrawing.SelectionSets.Add("111") sstext.Select(Common.AcSelect.acSelectionSetAll, , , FilterType, FilterData) Das ist viel schneller, dursucht aber die ganze Zeichnung. kann ich im nachhinein irgendwie herausfinden in welchem Layout sich die Blockref befindet? Dann könnte ich in einer weiteren Schleife die aus dem aktuellem Layout finden. Danke im Vorraus. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 13. Jan. 2011 08:42 <-- editieren / zitieren -->
Hi, >> Das ist viel schneller, dursucht aber die ganze Zeichnung. Um nicht die ganze Zeichnung zu durchsuchen, kannst Du auch bestimmen/filtern, in welchem Bereich ein Element liegt, das ganze mit dem DXF-Code 410 (z.B. (410 . "Layout1") ). Ergänze also Deinen Filter:
Code: FilterType(1) = 410 FilterData(1) = "Layout1" 'hier natürlich Deinen Layoutnamen
HTH, - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 13. Jan. 2011 12:01 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, das habe ich probiert. Funktioniert, solange es sich um Layouts handelt. Der Modellbereich ist eine Ausnahme. FilterType(1) = 410 FilterData(1) = "Modell" Das geht bei mir nicht Lieber wäre es mir ich könnte das Layout im nachhinein herausfinden. Das Blockref-Objekt muß doch irgendwo das Layout enthalten. Oder nicht? Die Datei bekomm ich z. B. mit BEZ(i).Datei = Bezeichnung.document.name Gibt es da nicht auch das Layout? Danke Hermann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 13. Jan. 2011 12:17 <-- editieren / zitieren -->
Hi, >> Der Modellbereich ist eine Ausnahme. [...] Das geht bei mir nicht Zeichne mal eine Linie im Modellbereich, dann starte folgendes LISP-Statement: (entget (car (entsel))) ...und Du wirst erkennen, dass sich hinter DXF-Code 410 "Model" verbirgt, mit einem 'l'. >> Lieber wäre es mir ich könnte das Layout im nachhinein herausfinden
Mit Entity.OwnerID (bzw. in 64bit Systemen) mit Entity.OwnerID32 kannst Du die ID des übergeordneten Objekts erkennen, das lässt dann den Rückschluss auf Modellbereich-ID oder Layout-Block-ID zu. HTH, - alfred - ------------------ www.hollaus.at |
| Projektleiter Tiefbau / Straßenbau / Tunnelbau / Kanalbau (m/w/d)* | Unser Mandant ist ein bundesweit tätiges Ingenieurunternehmen mit Großprojekten im Bereich Tiefbau. Die Spezialisierung des Unternehmens erstreckt sich über alle Technologiebereiche der Siedlungswasserwirtschaft, Straßenbaus, Tunnelbaus, Brückenbaus sowie des Energiemanagements. Zum nächstmöglichen Zeitpunkt suchen wir im Auftrag einen Projektleiter für den Standort Mainz, um die zukünftige Erfolgsgeschichte weiterhin zu prägen.... | Anzeige ansehen | Teamleitung, Gruppenleitung |
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 13. Jan. 2011 14:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, "mit einem l", das ist die Lösung. Da hatte ich nicht richtig hin geschaut. Das Layout kriege ich im nachhinein mit folgender kleinen Schleife heraus: For Each register In ThisDrawing.Layouts If Register.Block.ObjectID = Bezeichnung.Ownerid Then BEZ(i).Layout = Register.Name Next Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|