| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ObjectDBX (3205 mal gelesen)
|
FlorianP Mitglied Verm.-Ing
Beiträge: 44 Registriert: 04.12.2002 AutoCAD Map 3D 2006
|
erstellt am: 07. Sep. 2005 13:59 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, gerade befasse ich mich auch mit der ObjectDBX Geschichte. Habe die Beiträge von Fuchsi und die Seiten von mapcar gelesen (echt klasse die beiden), doch nun habe ich eine weitere Frage. Ich versuche aus einer mit DBX angehängten Zeichnung einen Block, nicht die Definition, sondern einen bestimmten Block herauszuholen. So wie ich gesehen habe gibt es bei dem Zeichnungsobjekt der 'angehängten Zeichnung' keine Möglichkeit einen Speichersatz zu erstellen. Ist das richtig? Gibt es eine andere Möglichkeit einen von ca. 8000 Blöcken zu selektieren, die in der Zeichnung sich befinden? Eine Möglichkeit würde ich in dem durchscannen aller einzelner Blöcke sehen. Dies habe ich jedoch noch nicht ausprobiert. Die Frage ist natürlich auch wie es dann mit der Performance ausschaut. Vielleicht hat jemand eine Idee. Viele Grüße Florian 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: 07. Sep. 2005 16:49 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Hallo Florian, also du willst nicht die Definition sondern den Einfügepunkt (Blockreferenz). Wenn es 80000 Blöcke sind ? Gibt es eine weitere Selektion z.B. Layer, Farbe, Blockname oder oder ? Man könnte dann ein Selectionset machen. Wenn man unter VBA als Verweis "autocad/ObjectDBX Common xx.0 .." angibt kann man mit dem Objektbrowser (F2) die Methoden und Eigenschaften anschauen. Gruss Stelli1 ------------------ [Diese Nachricht wurde von Stelli1 am 07. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FlorianP Mitglied Verm.-Ing
Beiträge: 44 Registriert: 04.12.2002
|
erstellt am: 08. Sep. 2005 07:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli1, also meine vorgehensweise sollte so sein, dass ich einen Block an einer definierten Stelle suchen will. Das ist ja normalerweise kein Problem, mit einem SelectionSet. Doch bei ObjectDBX habe ich bei dem Dokumentenobjekt 'AxDbDocument' kein SelectionSet zur Verfügung. Bei normaler Anwendung gibt es diesen SelectionSet. Kann ich auf eine andere Art und Weise diesen Block suchen oder einen SelectionSet erstellen? Gruß Florian 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: 08. Sep. 2005 10:52 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Hallo Florian, stimmt leider das es hier kein selectionset gibt. Suchen könnte man so:
Code:
Private Sub CommandButton1_Click() ' Ist unter Verweisen eingebunden Dim axDoc As New AxDbDocument axDoc.Open "D:\Daten_PZ\PZ_AW_DIN.DWG" Dim Entity As AcadEntity Dim BlockRef As AcadBlockReference Dim TestPunkt(0 To 2) As Double Dim InsPunkt As Variant TestPunkt(0) = 0: TestPunkt(1) = 0: TestPunkt(2) = 0 For Each Entity In axDoc.ModelSpace If Entity.EntityType = acBlockReference Then Set BlockRef = Entity InsPunkt = BlockRef.InsertionPoint If InsPunkt(0) = TestPunkt(0) Then ' usw .... Stop End If End If Next Entity End Sub
Ist wohl nicht so schön, geht aber recht zügig.Mir ist aber der Hintergrund nicht klar. Es sieht so aus, als würdest du AutoCAD als verkappte Datenbank nutzen wollen. Liest man z.B. Vermessungspunkte ein, ist es wichtig zu wissen ob an diesem Punkt in einem Fangkreis bereits ein Punkt war. Die Punkt werden in einer DB vorgehalten und gesucht. Beschreibe doch mal deinen Hintergrund. Stelli1 ------------------ [Diese Nachricht wurde von Stelli1 am 08. Sep. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FlorianP Mitglied Verm.-Ing
Beiträge: 44 Registriert: 04.12.2002
|
erstellt am: 08. Sep. 2005 11:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Stelli1 zum Hintergrund. Wir führen die Vermessungspunkte als Blöcke mit Attributen. Da wir aber so viele Punkte haben sind diese in mehreren Zeichnungen aufgeteilt, sortiert nach ihrer Zugehörigkeit. Die eigentliche Graphik führen wir wiederum in seperaten Zeichnungen. Zukünftig wollen wir schon die Punkte in eine Datenbank schreiben, doch leider sind wir noch nicht ganz soweit. Zum einen haben wir auf die FDO-Geschichte gesetzt, doch da das Formate von AutoCAD 2005 mit dem von 2006 nicht kompatibel ist warten wir bis wir auf 2006 upgedatet haben. Zu deinem Vorschlag, ja so wird es der einzigste Weg sein, um mein Problemchen zu lösen. Wie du schon gesagt hast, es dauert einwenig ist aber trotzdem recht fix abgearbeitet. Vielen Dank für deine Hilfe. Gruß Florian
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: 08. Sep. 2005 13:23 <-- editieren / zitieren --> Unities abgeben: Nur für FlorianP
Hallo Florian, wenn denn unbedingt so sein muss ... Wenn viele Punkte zu suchen sind würde ich nicht jedesmal die externe Zeichnung durchlaufen. Ich würde mir entweder ein Datenfeld, eine Objektklasse oder ein Recordset (da gibts auch ein Speicherinternes ADODB Recordset ohne DB Anbindung in dem man suchen kann wie in einem "richtigen") anlegen. Danach braucht man dann nur noch nach den effektiven Punkten suchen. Code:
' Modul Type MessPunkt Rechtswert As Double Hochwert As Double Höhe As Double PNR As String End TypePublic Punkte() As MessPunkt
Code:
Private Sub CommandButton1_Click() Dim axDoc As New AxDbDocument Dim Anzahl As Long ReDim Punkte(0 To 0) axDoc.Open "D:\Daten_pz\PZ_AW_DIN.DWG" Anzahl = Lese_Punkte(axDoc, Punkte()) End SubFunction Lese_Punkte(axDoc As AxDbDocument, Punkte() As MessPunkt) As Long Dim Anzahl As Long Dim Entity As AcadEntity Dim BlockRef As AcadBlockReference Dim InsPkt As Variant Dim PNR As String Dim Attr As AcadAttributeReference For Each Entity In axDoc.ModelSpace If Entity.EntityType = acBlockReference Then Anzahl = Anzahl + 1 Set BlockRef = Entity InsPkt = BlockRef.InsertionPoint ReDim Preserve Punkte(0 To UBound(Punkte) + 1) Punkte(UBound(Punkte)).Rechtswert = InsPkt(0) Punkte(UBound(Punkte)).Hochwert = InsPkt(1) Punkte(UBound(Punkte)).Höhe = InsPkt(2) If BlockRef.HasAttributes Then ' ..... ' bla bla PNR = 12345678 Punkte(UBound(Punkte)).PNR = PNR End If End If Next Entity Lese_Punkte = Anzahl End Function
oder doch Topobase ?Viel Erfolg Stelli1 ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|