| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Alle AcadCircle und Polygone durchlaufen (2049 mal gelesen)
|
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 08. Aug. 2007 22:17 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich habe gerade erst mit VBA in AutoCAD angefangen und stehe vor folgendem Problem: Ich habe einen Kanalplan der mehrere rote "Achtecke" und Kreise beinhaltet, in denen jeweils eine Nummer steht. Ich muss nun mittels VBA die Position des Achtecks bzw. Kreises mit der niedrigsten Nummer ermitteln. Ich habe schon versucht alle AcadCircles in ThisDrawing zu Durchlaufen aber bekomme laufend Fehler. Ich weiß leider auch nicht in welchem Layer die Objekte sind (Bitte um Verständnis, bin eh schon eifrig am Lernen . Im Anhang finden Sie einen Auszug aus dem Plan der die gesuchten Symbole beinhaltet! Vielen Dank für jedwede Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1357 Registriert: 24.07.2002 AutoCAD ACA 2018 Solidworks 2016 Sp5 Enterprise PDM 2016 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Samsung S24C650 Dell M4800
|
erstellt am: 09. Aug. 2007 07:00 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hi, Handelt es sich bei der Nummerierung um Blöcke, die den Tesxt und den Kreis / das Polygon enthalten?! Vielleicht kannst du ja mal einen Ausschnitt deines Plans hochladen, damit man eure Zeichenstruktur mal anschauen kann. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 09. Aug. 2007 11:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Carsten, vielen Dank für deine Antwort, ich kann dir leider nicht genau sagen, wie die Nummerierung gemacht wurde. Im Anhang habe ich einen Musterplan hochgeladen, bitte wirf selbst einen Blick drauf, liebe grüße Peter PS: ich musste die datei in ein rar-archiv verpacken. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 09. Aug. 2007 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hallo Peter, was möchtest Du genau machen? Deine Achtecke sind in wirklichkeit Kreise, nur durch den Zoomfaktor werden sie als Achtecke dargestellt. Sehe ich das richtig: Du möchtest alle Elemente (oder nur die Texte? Kreise?) auf dem Layer SUS_Kanal_Schmutz durchsuchen und den kleinsten Textwert suchen. Oder sollen alle Werte in eine Tabelle übernommen werden (wegen der Listbox im Formular) ? Poste doch mal Dein Anliegen. Grüße, Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 09. Aug. 2007 14:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, danke für deine Antwort. Das ganze Projekt ist sehr umfangreich, ich muss eine Software entwickeln, die aus dem Plan eine automatische Dokumentation mit Bildern usw. für den Kunden generiert. Ich werde dir den Ablauf kurz beschreiben: 1.) Ich muss zuerst alle roten Kreise auf dem Layer "SUS_Kanal_Schmutz" durchlaufen und die Position des Kreises mit der niedrigsten Nummer bestimmen. 2.) Links neben dem Kreis mit der Nummer 1 befindet sich ein Symbol mit der Beschriftung "0 m" auf dem Layer "SUS_Schrift". Dieses Symbol gibt mir den Startpunkt an. 3.) Nachdem ich den Startpunkt habe, gibt mir die rote Linie auf dem Layer "SUS Kanal misch_schmutz" den Verlauf des Kanals an. Links und Rechts gehen von der Roten Linie aus gelbe Linien auf dem Layer "SUS_Schrift" mit Längenangaben Weg (In diesem Fall die erste Linie nach links mit der Angabe "1,1m". Das würde in der fertigen Dokumentationsdatei zB "Muffenloch nach 1.1m" bedeuten). 4.) Diese Angaben muss ich zB in eine XML-Datei schreiben (Über die weitere Verarbeitung mittels Java und XML-Frameworks bin ich mir im Klaren, es geht nur um den VBA Teil) 5.) Anschließend suche ich den Kreis mit der Nummer 2 ..... usw. bis ich alles entlang der roten Linie durchlaufen habe. Wie würdest du das am sinnvollsten angehen?
Lg Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 09. Aug. 2007 14:50 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hallo Peter, was ist denn deine Aufgabe ? Einen Schadensplan, Kanalsanierungsplanung, Angebot ??? Hast du denn keinen Zugriff auf die ISYBAU Dateien ? Damit könnte man was machen. Wilfried PS: Was ist asdfds für ein Beruf ? ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 09. Aug. 2007 14:53 <-- editieren / zitieren --> Unities abgeben:
Hallo Wilfried, Es werden täglich Pläne gezeichnet und dazu muss für den Kunden manuell eine Dokumentationsdatei (PDF) erstellt werden, was sehr mühsam ist. Ich versuche nun eine gute Lösung zu finden mit der man die Dokumentation weitgehend automatisieren kann. Es handelt sich um Kanalpläne, wobei das eigentlich keine Rolle spielt. Welche Informationen beinhalten die ISYBAU-Dateien, ich würde sie sicher bekommen, wenn es notwendig ist, aber ich schätze das muss doch anders auch "einfach" gehen . Lg Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 09. Aug. 2007 17:05 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hallo Peter, wenn ihr die Zeichnungen erzeugt habt ihr doch alles im Griff. Die ISYBAU Datei ist das Ergebnis der Kanaluntersuchung. In den ISYBAU Dateien stehen die Schäden/Beobachtungen mit Station drin dir ihr in die Zeichung bebracht habt. Schau doch mal nach ISYBAU Typ H. Code: Beispiel Isybau Typ H: H 0196 11.12.2000 H HI 205406235 Mehrer Straße HI 305406235 05406235 05406230 012001200B K O 44.30 12 HI 405406235 0.00 03051801DIS HA HI 405406235 1.00 03053601DIS PA HI 405406235 3.19 03062601DIS 00000072 UCAR 3 0300 HI 405406235 17.93 03084701DIS S--O 1200 HI 405406235 25.60 03095001DIS S--O 1200 HI 405406235 35.69 03110301DIS S--O 1200 HI 405406235 43.00 03130301DIS PE HI 405406235 44.30 03134201DIS EH
Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 09. Aug. 2007 18:01 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hallo Peter, aus dem Profil entnehme ich dass Du Student bist, also ein bißchen Zeit hast Dich mit der Materie zu beschäftigen (die habe ich als Arbeitender leider nicht so viel). Dennoch hast Du Dir da was vorgenommen. Ich würde über einen SelectionSet mit Filter auf den Layer und Element Kreis mir zunächst einmal die Auswahl einengen. (Lies doch mal hier) Danach kannst Du mit Hilfe der Koordinaten des Kreismittelpunktes und eines Suchradius den Text (methode selectatpoint()) und den Block (ist nicht immer links) fangen. Der Tip von Stelli ist ganz gut, falls im Gebäudebereich solche Befahrungen durchgeführt werden, müßte die Datei vom Befahrer erzeugt werden können. Infos zum Aufbau der Datei gibt es in den Arbeitshilfen Abwasserund dort unter Zustandsdaten (Tip: Die meisten Befahrer und programme kennen das neue XML-Format noch nicht und verwenden den Isybau Typ H Grüße, Klaus edit: Die Isybau-Schnittstelle ist ein deutsches Format, aber bei Euch gibt es sicher etwas ähnliches zur übernahme der Inspektionsdaten. [Diese Nachricht wurde von KlaK am 09. Aug. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 09. Aug. 2007 19:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus! Scharfsinnige Erkenntnis bin Student und bessere mein Taschengeld auf... Zeit ist so eine Sache. Ich bin inzwischen schon einen Schritt weiter, habe die Startposition (Kreis mit Nummer 1) gefunden und muss jetzt zu dem gelben Symbol links daneben (Zwei inneinander verschachtelte Rechtecke - siehe Abbildung 1). Der Mittelpunkt dieses Objekts ist meine Startposition. Das Problem ist, dass ich keine Idee habe, wie das Objekt heißt bzw. wie ich es ansprechen kann. Bisher habe ich die Variante gewählt: Aufruf zB: ... = getEntitiesFromALayer ("SUS_Kanal_Schmutz", "AcDbCircle") Private Function getEntitiesFromALayer(LayerName As String, EntityName As String) As Collection Dim aLayer As AcadLayer Dim aEntity As AcadEntity Dim aObj As AcadObject Dim i As Integer Dim allEntities As Collection Set allEntities = New Collection For i = 0 To ThisDrawing.ModelSpace.Count - 1 Set aObj = ThisDrawing.ModelSpace.Item(i) If aObj.ObjectName = EntityName Then Set aEntity = aObj If aEntity.Layer = LayerName Then allEntities.Add aEntity, "e" & i End If End If Next Set getEntitiesFromALayer = allEntities End Function Anschließend habe ich den AcDbText mit der Nummer "1" gesucht und überprüft ob er in einem der Kreise steckt. Deine Methode mit dem SelectionSet ist sicher viel performanter, werde darauf umsteigen, aber so lange sich keine großen Performance-Probleme ergeben eilt es nicht. Kannst du mir bitte sagen, wie ich das Objekt links neben dem Kreis anspreche bzw. um was es sich handel (zB "AcDbBlock"...). Habe das Objekt doppelt angeklickt und einen Screenshot davon gemacht, damit du gleich weißt um was es sich handelt - siehe Abbildung 2. Lg Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 09. Aug. 2007 20:05 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Wie das jpg schon zeigt: es ist ein Block mit Namen 60_40 (sieht man auch unter Eigenschaften,oben steht dort Blockreferenz unter verschiedenes bei Name 60_40)) Zum testen wie man ein Element anspricht könnte man das getentity beispiel verwenden. Muß jetzt aber heimfahren, ist schon spät genug. Wie dringend ist das Ganze? Grüße nach Kärnten Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 09. Aug. 2007 20:11 <-- editieren / zitieren --> Unities abgeben:
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 09. Aug. 2007 20:28 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hallo Peter, wäre dein Profil von Anfang an ausgefüllt gewesen hätte ich sehen können das du mit Isybau wahrscheinlich nichts anfangen kannst. Gibt es in Österreich nichts ähnliches ? Zum AutCAD Problem: Du musst dir zuerst ein Selectionset bilden (gibts jede Menge Beispiele in Forum) Am Selectionset hängen einige Methoden um eine Auswahl -auch gefiltert- aus der Zeichnung zu holen. Zu jeder Methode gibt es in der AutoCAD (VBA)Hilfe ein Beispiel. Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Aug. 2007 17:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Wilfried, habe doch glatt das gesuchte Code-Fragment gefunden , danke: Dim blockset As AcadSelectionSet Dim entity As AcadEntity Dim FType(1) As Integer, FData(1) FType(0) = 0: FData(0) = "INSERT" FType(1) = 2: FData(1) = "60_40" Set blockset = ThisDrawing.SelectionSets.Add("BLOCKSET2") blockset.Select mode:=acSelectionSetAll, Filtertype:=FType, filterdata:=FData For Each entity In blockset MsgBox entity.ObjectName Next entity blockset.Delete Liebe Grüße Pete
PS: Habe meine Daten bereits ergänzt! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 10. Aug. 2007 18:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, noch eine Frage: Wenn ich jetzt eine Position weiß, mittels Selectionset alle Blöcke selektiert habe, wie finde ich am besten heraus, welcher Block meiner Position am nächesten ist? Gibt es eine Methode dafür oder soll ich zB einfach die Summe aus der X- und Y-Differenz heranziehen? Lg Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 10. Aug. 2007 21:24 <-- editieren / zitieren --> Unities abgeben: Nur für pistolpete1
Hallo Peter, ich weis dass programmieren unheimlich Spaß machen kann, aber Du solltest nebenbei auch der Antwort von Stelli nachgehen. Der Block 60_40 bezeichnet eine Rohrklappe in der DN150 Leitung. Dort wird die Kamera eingesetzt. Daneben zeigen die Pfeile die Befahrungsrichtung an. In dem Musterausschnitt gibt es noch Putzstücke (so werden die Klappen auch manchmal bezeichnet) mit 60_60 (=Blockname) und Putzer (ebenfalls Blockname). Bei Deiner Programmierung möchtest Du bei Öffnung 1 beginnen und dann aufsteigend die Putzstücke durchlaufen. Wenn Du Dir die Zeichnung noch mal ansiehst, ist zu erkennen, dass die Befahrung von 2 durchläuft bis zur Einmündung in den öffentlichen Kanal, also über 3, 4a und 4b hinweg. Ebenso in die andere Richtung über 5 und 6. Lediglich bei 7 und 8 gibt es wieder 2 Befahrungsrichtungen. Wenn Du Dir mal überlegst welchen Aufwand es macht diesen Plan zu zeichnen, wirst Du zum Schluß kommen, mit einem Programm geht das doch wesentlich schneller. Deshalb wurde in Deutschland Isybau eingeführt und für bestimmte Ereignisse allgemeingültige Kürzel eingeführt. Auch die Kamerabefahrer in Österreich machen das und schreiben ein Protokoll bei der Befahrung mit. Diese müßtet Ihr Euch nur kopieren und habt die Dokumentation zum Plan. Überlegs mal, schönes Wochenende, Klaus PS: Die kleine Kreise und Texte auf Layer SUS_Schmutz dürften Verweise auf die Bilder sein, die bei dem Schadensereignis gemacht wurden. und noch was: Schau doch mal hier. Die Firma Sauber und Sicher Kanaluntersuchungen hat ein AutoCAD Planbearbeitungsprogramm (=> Layername SUS_ ). Also das Rad nicht zweimal erfinden.
[Diese Nachricht wurde von KlaK am 10. Aug. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pistolpete1 Mitglied Student
Beiträge: 102 Registriert: 06.01.2007
|
erstellt am: 11. Aug. 2007 13:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, möglicherweise hast du recht, das Ganze auf meine geplante Art zu lösen wird enorm schwierig. Ich glaube es ist aber möglich. Ich werde mich heute nach den ISYBAU-Dateien erkundigen, möglicherweise weiß mein Auftraggeber selber nicht darüber Bescheid. Danke dass ihr mich darüber informiert habt! Vielen Dank, Liebe Grüße Peter PS: Dieses Forum ist wirklich Gold wert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |