Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Externer Zugriff auf Objekte von Shape-Verknüpfung mit C#

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Externer Zugriff auf Objekte von Shape-Verknüpfung mit C# (2437 mal gelesen)
mOfl
Mitglied



Sehen Sie sich das Profil von mOfl an!   Senden Sie eine Private Message an mOfl  Schreiben Sie einen Gästebucheintrag für mOfl

Beiträge: 22
Registriert: 25.09.2010

erstellt am: 25. Sep. 2010 23:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

ich beschäftige mich als Programmierer für eine kleine Auftragsarbeit notgedrungen mit AutoCAD Civil 3D 2010, habe also keinerlei nennenswerte Kenntnisse über das Programm. Da ich momentan die internen Zusammenhänge in AutoCAD nicht durchschaue, fällt es mir auch schwer, einen vernünftigen Titel für den Thread zu finden. Ich will aber versuchen, das Problem so gut wie möglich zu beschreiben.

Es existiert eine C#-Anwendung, die mit verschiedenen Datenbanken hantiert. Die Daten sind hierbei Grundstücksinformationen, jeder Eintrag besitzt eine eindeutige Flurstücksnummer. Auf der anderen Seite gibt es einen großen Geländeplan als dwg-Datei, in dem alle in der Datenbank vorhandenen Grundstücke liegen. Der Geländeplan enthält allerlei Text-, Polygonlinien- und sonstige Entities auf mehreren Layern. Die Aufgabe ist nun, anhand der Flurstücksnummern aus der externen C#-Anwendung zu dem dazugehörigen Bereich in der CAD-Datei zu springen (Pan und Zoom), um diesen Ausschnitt letzten Endes zu plotten. Um das zu bewerkstelligen, wurde die dwg-Datei mit einer Shape-Datei versehen, die die Geometrieinformation der Grundstücke sowie die Flurstücksnummer in einer Datenbank anfügt. Der momentane Stand ist also, dass die dwg-Datei mit einer Shape-Datei verbunden ist, sodass ich im "Aufgabenfenster" nun zwei Einträge stehen habe, nämlich "Kartenbasis" und "Grundstücke", wobei ich letzterem Stile zuordnen kann etc.. Zusätzlich kann ich mit einem Rechtsklick auf "Grundstücke" "Datentabelle anzeigen" auswählen, wo ich eben diese angefügte Datenbank sehe. Klicke ich einen Eintrag dieser Tabelle an, springt das Programm auch komfortabel zu dem gewünschten Landschaftsbereich.

Ich hoffe, damit konnte ich die Ausgangssituation der Dateien gut erklären und ihr könnt es, auch wenn mir die Fachbegriffe fehlen, nachvollziehen.

So, wie gesagt, möchte ich diese Datentabelle nun aus C# heraus ansprechen, um zu den jeweiligen Grundstücken zu springen und auch Layer entsprechend zu verändern (z.B. sollte bei manchen Grundstücken die Farbe der Flächen anders sein, etwa um Laub- und Nadelwälder zu unterscheiden). Jetzt die Frage: Wie geht das?

Ich habe wirklich lang gesucht, aber durch meiner Unkenntnis über AutoCAD fällt es mir schwer, überhaupt die richtigen Begriffe zu finden, nach denen ich suchen muss.

Meine bisherige Herangehensweise in C# war die folgende:

Code:
AcadApplication myCADApp = (AcadApplication) Marshal.GetActiveObject("AutoCAD.Application");

//Entities auslesen
ArrayList entities = new ArrayList();

for (int i = 0; i < myCADApp.ActiveDocument.ModelSpace.Count; i++) {
      entities.Add(myCADApp.ActiveDocument.ModelSpace.Item(i));
}


//Layer auslesen
ArrayList layers = new ArrayList();

for (int i = 0; i < myCADApp.ActiveDocument.ModelSpace.Database.Layers.Count; i++) {
      layers.Add(myCADApp.ActiveDocument.ModelSpace.Database.Layers.Item(i));
}


Die Objekte können anhand der Objektnamen gecasted und dann korrekt behandelt, das ist überhaupt kein Problem, nur leider sind hier die Objekte, die ich eigentlich haben möchte, nicht enthalten, d.h. die Geometriedaten, die ich seit dem Verbinden mit der Shape-Datei habe und auch auswählen kann, tauchen nicht in diesen Listen auf, ebensowenig wie die Layer, auf denen sie liegen. Wenn ich ein solches Objekt markiere und mir die Eigenschaften anzeigen lasse, steht in dem Eigenschaften-Fenster oben in der ComboBox "Map Feature(s)" (wo sonst z.B. "Polylinie" steht), bei Layer "Grundstücke", bei Objektklasse "Default:Grundstücke", dann folgen die Objekteigenschaften inklusive Flurstücksnummer, und zuletzt steht als Geometrie-Typ "Polygon". Aber, wie gesagt, ich finde weder das Polygon noch den Layer "Grundstücke" in meinen Listen.

Weiß einer, was ich machen muss, um das zu ändern? Wenn die Objekte nicht in ActiveDocument.ModelSpace zu finden sind, wo dann?

Ich würde mich wirklich außerordentlich um Hilfe freuen, da ich momentan echt nicht mehr weiter weiß.

Viele Grüße

mOfl

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 25. Sep. 2010 23:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

herzlich willkommen bei CAD-de! 

Erstmal: die Beschreibung ist super! Mach Dir mal deswegen keine Sorgen. 

Dann: Die über FDO eingebetteten Shapes sind keine AutoCAD-Elemente im eigentlichen Sinne, die kannst Du nicht über die Entity-Collection im Modelspace angreigen. Vielleicht leichter verständlich folgendes Beispiel: wenn Du ein Image im AutoCAD plazierst, hast Du auch keinen Zugriff auf die einzelnen Pixel durch Scannen des Modellbereichs, ebenso verhält es sich bei den über FDO verbundenen Punkte/Linien/Polygone.

Und: die Darstellung der FDO-Elemente (lt. Deiner Aussage '...bei manchen Grundstücken die Farbe der Flächen anders sein...') lässt sich auch nicht über AutoCAD-Layer oder Objekteigenschaften steuern, dazu gibt es die Stile (und nur diese).

Daraus folgt: Den Umgang mit FDO-Elementen lernst Du am besten durch Download des ObjectARX-Kits für Map3D (kostenlos, aber registrierungspflichtig), in diesem findest Du dann unter
<Basisverzeichnis>\Map Samples\Platform
viele Beispiele für den Umgang mit FDO-Daten. Weitere hilfreiche Info's zu FDO findest Du hier >>>www.osgeo.org<<<

--------------------------------------------------

Alternative Vorgehensweise, wenn Du die Elemente als AutoCAD-Geometrie haben willst, wäre dann die SHAPE-Daten zu importieren statt diese mit FDO zu verbinden. Damit hast Du die DBF-Daten der Shapes als Objektdaten (=Suchbegriff), auch da findest Du im ObjectARX-Kit unter
<Basisverzeichnis>\Map Samples\DotNet
einiges an Hilfe für den Zugriff auf Objektdaten.

Vorteil dieser Variante könnte für Dich sein, dass nach dem Import die Elemente wirklich AutoCAD-Geometrieelemente sind, damit wird für AutoCAD-Programmierkenner die Einstellungsmöglichkeit von Farbe/Linientyp/Linienstärke/Füllung etc. sicher einfacher als mit FDO-Stilen sich herumschlagen zu müssen.
Nachteil (gegenüber FDO): die Vorteile von FDO sind einfach verloren, und das sind einige.

HTH, - alfred -

------------------
www.hollaus.at

mOfl
Mitglied



Sehen Sie sich das Profil von mOfl an!   Senden Sie eine Private Message an mOfl  Schreiben Sie einen Gästebucheintrag für mOfl

Beiträge: 22
Registriert: 25.09.2010

erstellt am: 26. Sep. 2010 00:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Herzlichen Dank für die schnelle und hilfreiche Antwort! Ich lade mir nun zunächst ObjectARX für Map 3D herunter und lese mich da ein. Es hilft ja schon, dass ich überhaupt weiß, wo mein Problem hingehört ("Map 3D").

Zu der alternativen Vorgehensweise mit Objektdaten: Der ganze Aufwand mit der Shape-Datei wird ja betrieben, um Geometrie-Informationen mit den Flurstücksnummern einer Datenbank zu verbinden, um damit dann Objekte über die Flurstücksnummer ansprechen zu können. Das ist der ganze Sinn davon.
Wenn ich die Sache auch machen kann, ohne mich mit FDOs rumzuschlagen, wär mir das sehr recht. Also wenn ich das richtig verstehe, wäre das mit den Objektdaten so, dass ich die Geometriedaten ganz normal in die Modelspace-Entity-Collection einfüge, nur zu jeder Entity noch zusätzliche Attribute speicher, grob gesprochen. Ist das so? Weil dann würde das für mich nach dem idealen Weg klingen, die restlichen Vorzüge von FDOs, die es so geben mag, interessieren mich glaube ich ja nicht.

Gruß

mOfl

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 26. Sep. 2010 00:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

>> Also wenn ich das richtig verstehe, wäre das mit den Objektdaten so, dass ich die Geometriedaten ganz normal
>> in die Modelspace-Entity-Collection einfüge, nur zu jeder Entity noch zusätzliche Attribute speicher,
>> grob gesprochen. Ist das so?

'Grob gesprochen' .... eher sehr grob gesprochen ==> JA so ist es.

Importieren der Shapedaten (mal händisch wäre der Befehl _MAPIMPORT) generiert Geometrieelemente aus den geographischen Shape-Informationen PLUS aus den DBF-Daten werden an jedes importierte Element die attributiven Daten aus dem entsprechenden DBF-Record angehängt (als Objektdaten).

HTH, viel Erfolg, - alfred -

------------------
www.hollaus.at

mOfl
Mitglied



Sehen Sie sich das Profil von mOfl an!   Senden Sie eine Private Message an mOfl  Schreiben Sie einen Gästebucheintrag für mOfl

Beiträge: 22
Registriert: 25.09.2010

erstellt am: 26. Sep. 2010 00:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank, ich denke, damit werde ich zurecht kommen! Wenn nicht, melde ich mich noch einmal 

Gruß

mOfl

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz