| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: JoinEntity() (1475 / mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 09. Feb. 2016 10:42 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich bin nicht sehr glücklich mit dieser Methode. Es sollen 3dPolylinien miteinander verbunden werden. Das erledigt die Methode zwar einwandfrei, jedoch bei grösseren Datenmengen, bewegt man sich nahe dem Absturz. Code:
public void JoinCommand(string Layname) { Document doc = AcAp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; TypedValue[] filList = { new TypedValue(0, "POLYLINE"), new TypedValue(8, Layname), new TypedValue(-4, "&"), new TypedValue(70, 8) }; SelectionFilter filter = new SelectionFilter(filList); PromptSelectionResult psr = ed.SelectAll(filter); if (psr.Status != PromptStatus.OK) return; object peditAccept = Application.GetSystemVariable("PEDITACCEPT"); Application.SetSystemVariable("PEDITACCEPT", 1); try { ed.Command("_.PEDIT", "_Multiple", psr.Value, "", "_Join", 0.0, ""); } catch (System.Exception ex) { ed.WriteMessage("\nError: n{0}", ex.Message); } finally { Application.SetSystemVariable("PEDITACCEPT", peditAccept); } }
Ich hatte mir auch Gedanken gemacht hinsichtlich der Methode JoinEntity() bzw. JoinEntities(). Sobald aber keine "aneinanderliegende" 3dPolylinien gefunden werden kommt null. Ein weiterer Ansatz könnte sein, indem man die vertex ausliest in PointCollection einsammelt und dann eine neue 3dPoly zeichnet. Hier kommt das Hinter nis, dass quasi über alle Punkte ein 3dPoly gezeichnet wird. Hat einer eine bessere Idee, oder Ansatz gleiches wie oben im Code zu bewrkstelligen, rein in .net ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
[Diese Nachricht wurde von cadplayer am 09. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2016 10:57 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 09. Feb. 2016 18:32 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: bei grösseren Datenmengen, bewegt man sich nahe dem Absturz
Was sind größere Datenmengen? Um wie viele 3D-Polylinien geht es da und vielleicht auch interessant, um wie viele Vertizes? Bewegst Du Dich nur "nahe des Absturzes" wenn Du das über ed.Command startest oder auch wenn Du es direkt über die Befehlszeile ausführst? Grundsätzlich: wenn man Kontrolle über Funktionen haben möchte (und nicht im Nachhinein Befehlszeile analysieren möchte (dann auch in verschiedenen Sprachen) würde ich immer versuchen ohne die diversen .xxxCommmandxxx auszukommen. Bei diesem Code würden schon bei gesperrten Layern und auch bei 3D-Polylinien in verschiedenen Layouts Rückmeldungen kommen, die dann nur schwer abzufangen wäre. Kleine Rückfrage: Ist diese Zeile aus Deiner Sicht notwendig: new TypedValue(-4, "&"), . ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Feb. 2016 07:08 <-- editieren / zitieren --> Unities abgeben:
Danke für den Typ, die Anweisung mit ed.Command macht im Prinzip gleiches, wie als würde ich die Eingaben über die Befehlszeilen laufen lassen. Es kommt auf die Anzahl der Layer an, deren 3dPolys verbunden werden sollen (vielleicht 100 per Layer ?!). Generell meide ich auch Command-Anweisungen einzusetzen, nur bietet mir das API nicht eine vergleichbare Methode. Was ich eben nur festgestellt habe ist, lese ich nur mal alle vertex aus und zeichne darüber dann eine 3dPoly, das geht in null-komma-nix. Worin mein Problem besteht ist, zu sagen, wann eine Contour (mehrere aneinanderliegende) fertig ist, um dann zu nächsten Contour überzugehen. Hier ein Ansatz, womit ich vergleiche wie sich 3dPolys in der Collection lst zueinander verhalten und quasi eine Liste zurückgibt von allen "sortierten" 3dPolys Code:
public static List<Extensions> JoinSS(List<Extensions> lst) { Document doc = AcAp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; Tolerance tol = Tolerance.Global; List<Extensions> lst2 = new List<Extensions>(); Extensions output = new Extensions(); using (Transaction tr = db.TransactionManager.StartTransaction()) { while (lst.Count > 0) { lst2.Add(lst[0]); //ObjectId source = lst[0].OId; Point3d start = lst[0].StartPoint; Point3d end = lst[0].EndPoint; lst.RemoveAt(0); while (true) { int i = lst.FindIndex(s => s.StartPoint.IsEqualTo(end, tol)); if (i >= 0) { //ObjectId add = lst[0].OId; lst2.Add(lst[i]); end = lst[i].EndPoint; lst.RemoveAt(i); //output.Join3dPolylines(source, add); continue; } i = lst.FindIndex(s => s.EndPoint.IsEqualTo(end, tol)); if (i >= 0) { //ObjectId add = lst[0].OId; lst2.Add(lst[i]); end = lst[i].EndPoint; lst.RemoveAt(i); //output.Join3dPolylines(source, add); continue; } i = lst.FindIndex(s => s.EndPoint.IsEqualTo(start, tol)); if (i >= 0) { //ObjectId add = lst[0].OId; lst2.Add(lst[i]); lst[i].Inverse(); start = lst[i].StartPoint; lst.RemoveAt(i); //List<clsExtensions> obj = output.Join3dPolylines(source, add); //lst.Add(obj[0]); continue; } i = lst.FindIndex(s => s.StartPoint.IsEqualTo(start, tol)); if (i >= 0) { //ObjectId add = lst[0].OId; lst2.Add(lst[i]); lst[i].Inverse(); start = lst[i].StartPoint; lst.RemoveAt(i); //output.Join3dPolylines(source, add); continue; } break; } } tr.Commit(); return lst2; } }
------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 10. Feb. 2016 07:23 <-- editieren / zitieren --> Unities abgeben:
Hier eine Zeichnung, damit ihr vielleicht besser verstehen könnt, was verbunden werden soll. Das Ergebnis sieht so aus wie im Bild. Ich möchte jedoch erreichen, dass nicht eine Polylinie über alle vertex gezeichnet wird, sondern nur da wo tatsächlich Polylinien in unverbundenen Zustand gezeichnet sind. Hat jemand eine Idee, wie ich das in der Methode JoinSS() einbauen könnte? ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 10. Feb. 2016 07:58 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... dann musst du eine Programmlogik zum vergleichen der Start und Endpunkte entwickeln, damit du eben feststellen kannst, ob der aktuelle Linienzug fortgeführt werden soll oder nicht. Wie oben bereits geschrieben: Methoden sind bekannt, die Logik liefert dir keine API, muss also von dir kommen. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Feb. 2016 09:09 <-- editieren / zitieren --> Unities abgeben:
Nja Holger, das macht die Funktion ja bereits Start- und Endpunktvergleich. Ich bekomme rein gedanklich keine Logik zustande. Die vier Fälle sind berücksichtigt. Betrachte ich "3dPolylinie A" mit anschliessender "3dPolylinie B", dann ergeben sich 4 Fälle: 1) B.Startpunkt = A.Endpunkt 2) B.Endpunkt = A.Endpunkt 3) B.Endpunkt = A.Startpunkt 4) B.Startpunkt = B.Startpunkt Tritt keines von alldem ein müsste quasi eine neue 3dPolylinie gezeichnet werden. In der o.g. Methode müssten dann mehrere Listen mit 3dPolylinienpaaren ausgegeben werden. Ist das so machbar ? ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|