Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  JoinEntity()

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:  JoinEntity() (1475 / mal gelesen)
cadplayer
Ehrenmitglied
CADniker


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 09. Feb. 2016 10:42    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 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




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 09. Feb. 2016 10:57    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 Nur für cadplayer 10 Unities + Antwort hilfreich

... die Möglichkeiten hast du aufgezählt, die Logik musst du dir selbst erarbeiten, weil nur du weißt, was dein Ziel ist.

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

Ingenieur Studio HOLLAUS
Mitglied
CAD / CAFM / GIS Beratung-Programmierung-Schulung


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

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 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 Nur für cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 10. Feb. 2016 07:08    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

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


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

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 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


2016-02-1007-20-37.png


Beispiel.dwg

 
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




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 10. Feb. 2016 07:58    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 Nur für cadplayer 10 Unities + Antwort hilfreich

... 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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 10. Feb. 2016 09:09    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

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 >>)

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