| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Auswahlsatz, Filter für selectionsets (4803 mal gelesen)
|
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 08. Okt. 2009 13:50 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich versuche seit geraumer Zeit einen funktionierenden Filter für einen Auswahlsatz herzustellen. Filter: Objekt muss haben - Layername xy - im Modellbereich liegen - entweder - eine Polylinie - oder ein Kreis sein Nehme ich nur die erste Bedingung sind Objekte im Auswahlsatz. Nehme ich die anderen Bedingungen dazu ist kein Objekt im Auswahlsatz. Sicher ist: Auf dem gesuchten Layer gibt es im Modellbereich eine geschlossene PL und einen Kreis. Hier mein letzter Versuch:
Code:
Dim ssFarbe As AcadSelectionSet Dim FilterType(5) As Integer Dim FilterData(5) As Variant Set ssFarbe = ThisDrawing.SelectionSets.Add("ssFarbe1") FilterType(0) = 8 'Filter Layer FilterData(0) = aktLayer.Name 'Layername als String FilterType(1) = 410 'Filter Modell/Layout FilterData(1) = 0 '0=Model; 1=Papierber FilterType(2) = 0 'Objekttyp als Filter FilterData(2) = "<OR" 'Objektname als String FilterType(3) = 0 'Objekttyp als Filter FilterData(3) = "Polyline" 'Objektname als String FilterType(4) = 0 'Objekttyp als Filter FilterData(4) = "Circle" 'Objektname als String FilterType(5) = 0 'Objekttyp als Filter FilterData(5) = "OR>" 'Objektname als String
Noch eine Frage: Gibt es irgendwo eine List bei der ich die zahlenwerte für AcDbPolylinie etc. nachlesen kann?
------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 08. Okt. 2009 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für otm
|
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 09. Okt. 2009 09:15 <-- editieren / zitieren --> Unities abgeben:
@CADmium Danke, hab ich geändert. Funktioniert aber trotzdem nicht. Es werden immer 0 Objekte im Auswahlsatz ausgeworfen. Hier nochmal der gesamte Code:
Code: For Each aktLayer In ThisDrawing.Layers If UCase(aktLayer.Name) Like Gruppe Then 'Nur Layer bei denen der filternde Textstring 'Gruppe' im Layernamen vorkommt bearbeiten 'Auswahlsatz mit allen Objekten bilden, die den Filterkriterien entsprechen und diese zählen 'Löscht nur den einen benötigten Auswahlsatz, falls vorhanden. Fehlerabfang, wenn nicht vorhanden On Error Resume Next ThisDrawing.SelectionSets.Item("ssFarbe1").Delete On Error GoTo 0 'Auswahlsatz definieren Dim ssFarbe As AcadSelectionSet Dim FilterType(5) As Integer Dim FilterData(5) As Variant Set ssFarbe = ThisDrawing.SelectionSets.Add("ssFarbe1") 'Filter definieren FilterType(0) = 8 'Filter Layer FilterData(0) = aktLayer.Name 'Layername als String FilterType(1) = 410 'Filter ob Modell oder Layout FilterData(1) = "Model" '0=Model; 1=Papierbereich FilterType(2) = 0 'Objekttyp als Filter FilterData(2) = "<OR" 'Objektname als String FilterType(3) = 0 'Objekttyp als Filter FilterData(3) = "Polyline" 'Objektname als String FilterType(4) = 0 'Objekttyp als Filter FilterData(4) = "Circle" 'Objektname als String FilterType(5) = 0 'Objekttyp als Filter FilterData(5) = "OR>" 'Objektname als String 'Alle Objekte mit dem Filterkriterium in den _ Auswahlsatz aufnehmen ssFarbe.Select acSelectionSetAll, , , FilterType, FilterData 'Prüfen, wieviel Objekte im Auswahlsatz sind Dim ObjAnz As Integer ObjAnz = ssFarbe.Count Debug.Print ObjAnz & " Objekte auf Layer " & aktLayer.Name 'Hier erscheint immer eine 0 If ObjAnz <> 0 Then 'Wenn Objekte (Polylinien, Kreise) auf dem aktuell bearbeiteten Layer liegen, ' dann ... End If Next
Ziel ist alle geschlossenen Polylinien und Kreise auf einem Layer farbig anzulegen. Was mache ich bei dem Filter falsch? ------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 09. Okt. 2009 10:37 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Hallo Christian, der Filtertype für "<OR" und "<OR" ist -4 nicht 0. folgender Filter funktioniert bei mir: Code:
FilterType(0) = 410 'Filter ob Modell oder Layout FilterData(0) = "Model" '0=Model; 1=Papierbereich FilterType(1) = -4 'Objekttyp als Filter FilterData(1) = "<OR" 'Objektname als String FilterType(2) = 0 'Objekttyp als Filter FilterData(2) = "LWPolyline" 'Objektname als String FilterType(3) = 0 'Objekttyp als Filter FilterData(3) = "Circle" 'Objektname als String FilterType(4) = -4 'Objekttyp als Filter FilterData(4) = "OR>" 'Objektname als String
lg Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 09. Okt. 2009 11:56 <-- editieren / zitieren --> Unities abgeben:
danke Didi , bin jetzt einen Schritt weiter. Noch ne Nachfrage: Wo kann ich denn eine Übersicht finden über die Filtertype und Filterdata-Begriffe. Z.B. für Polylinie oder für acdbhatch. ------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 09. Okt. 2009 14:12 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Hallo Christian das solltest du in der Autocad-Entwicklerhilfe (im Hilfemenü) finden. Ich bin da auch nicht so fit, aber ich denke der Filtertype ist ident mit dem DXF-Gruppencode. Eventuell ist es auch Hilfreich im Acad mit dem Befehl Liste die Eigenschaften eines Objektes abzufragen, um den Objektnamen zu bekommen. lg Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Okt. 2009 23:20 <-- editieren / zitieren -->
Hi Christian, Didi hat schon recht mit den DXFCodes. Als Zusatz mmöchte ich noch eine Info anhängen: Zum Verifizieren der Eingeschaften eines Elemente (und um zu diesen Eigenschaften des Objekts für den Filter zu kommen) probier mal in der Befehlszeile einzugeben: (entget (car (entsel))) Dann wirst Du nach einem Objekt gefragt, klick es an und Du bekommst die Info's in einer Liste von (Code . Wert) Als Beispiel siehst Du dann (410 . "Model") Bedeutet DXFCode 410 und im Wert steht ein String mit dem Inhalt 'Model'. - alfred - ------------------ www.hollaus.at |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 10. Okt. 2009 08:09 <-- editieren / zitieren --> Unities abgeben: Nur für otm
besser noch (entget(car(entsel))'("*")) .. da gibts -wenn vorhanden- auch noch die Erweiterten Daten .. hinzu ... ist aber LISP und mit (entget(car(nentsel))'("*")) kann man auch verschachtelte Objekte wählen .. z.B. einen Linie durch anklicken dieser in einer Blockref oder einen Vertex bei einer 2D-PL .... nur mal am Rande .. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 10. Okt. 2009 18:04 <-- editieren / zitieren --> Unities abgeben:
|
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 12. Okt. 2009 13:17 <-- editieren / zitieren --> Unities abgeben:
Hat geklappt, hier nochmal der fertige Filter:
Code: FilterType(0) = 8 'Filter Layer FilterData(0) = aktLayer.Name 'Layername als String FilterType(1) = 410 'Filter ob Modell oder Layout FilterData(1) = "Model" '0=Model; 1=Papierbereich FilterType(2) = -4 'Objekttyp als Filter FilterData(2) = "<OR" 'Objektname als String FilterType(3) = 0 'Objekttyp als Filter FilterData(3) = "LWPOLYLINE" 'Objektname als String '"LWPolyline","Circle" FilterType(4) = 0 'Objekttyp als Filter FilterData(4) = "Circle" 'Objektname als String FilterType(5) = -4 'Objekttyp als Filter FilterData(5) = "OR>" 'Objektname als String
Noch eine weitere Frage: Die ausgewählten Polylinien und Kreise haben teilweise Solids als Füllung. Jetz versuche ich diese Solids auszuwählen (und zu löschen). Mit folgendem Filter bekomme ich sie nicht. Code: FType(0) = 8 'Filter Layer FData(0) = aktLayer.Name 'Layername als String FType(1) = 410 'Filter ob Modell oder Layout FData(1) = "Model" '"Model"; "Layout" FType(2) = 0 'Filter Objekt FData(2) = "HATCH" 'Objektart als String
Die Solids sind mit dem Objekt noch 'verlinkt'.Wie muss ich das denn angeben? ------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Okt. 2009 13:41 <-- editieren / zitieren -->
Hi Christian, erstes kannst Du mal vereinfachen (diese OR-Klammerung machts ja nicht wirklich einfach lesbar), or-Verknüpfungen für eine Filtereigenschaft kannst Du mit Komma getrennt einfach hintereinander schreiben:
Code: FilterType(0) = 8 'Filter Layer FilterData(0) = aktLayer.Name 'Layername als String FilterType(1) = 410 'Filter ob Modell oder Layout FilterData(1) = "Model" '0=Model; 1=Papierbereich FilterType(2) = 0 'Objekttyp als Filter FilterData(2) = "LWPOLYLINE,CIRCLE" 'Objektname als String '"LWPolyline","Circle"
>> Die Solids sind mit dem Objekt noch 'verlinkt'.
Du meinst, wenn Du ein SelectionSet mit dem Filter mit (0 . "HATCH") erstellst, dass da andere Elemente als Schraffuren enthalten sind ==> glaub ich mal nicht. Wirklich überprüft? - alfred - ------------------ www.hollaus.at |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 12. Okt. 2009 16:43 <-- editieren / zitieren --> Unities abgeben:
Hi alfred, danke für den Vereinfachungstipp. Meine Vermutung ist, es sind keine Schraffuren im ss. Ausgangssituation: ein Layer mit a einem Kreis b einer geschlossenen PL c einer offenen PL d einer schraffur ohne PL (PL wurde gelöscht) Folgender Filter
Code:
FType(0) = 8 FData(0) = aktLayer.Name FType(1) = 410 FData(1) = "Model" FType(2) = 0 FData(2) = "HATCH"
Ergebnis: 3 Objekte im Auswahlsatz Wenn ich diese 3 Objekte mit sshatch.erase lösche, werden die Polylinien (auch die offene) gelöscht. Die Solids bleiben. Problem/Frage: Kann eine offene Polyline eine Schraffur erhalten? Wie muss ich die Schraffur ansprechen, ohne die dazugehörige PL anzusprechen? Ziel soll sein, alle auf einem Layer liegenden Objekte, die Flächen enthalten können (aber nicht müssen), auf Flächenfüllungen zu überprüfen, die Füllungen gegebenenfalls zu löschen und alle Objekte neu mit Flächen anzulegen.
------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Okt. 2009 16:59 <-- editieren / zitieren -->
Hi Christian, ich hab's jetzt probiert, ich bekomme nur 1 Objekt im SelectionSet lt. Deinem Filter zurück, wenn auf (0 . "HATCH") gefiltert ist, dann kann keine Polylinie zurückkommen. Kann es sein, dass Du vor dem .Select vorher das SelectionSet nicht geleert hast? Mein Test wäre:
Code: Dim tSSet As AcadSelectionSet Dim tDxfCodes(2) As Integer Dim tDxfValues(2) As Variant On Error Resume Next Set tSSet = ThisDrawing.SelectionSets.Add("TEST") If (tSSet Is Nothing) Then Set tSSet = ThisDrawing.SelectionSets.Item("TEST") tSSet.Clear tDxfCodes(0) = 410 tDxfValues(0) = "Model" tDxfCodes(1) = 8 tDxfValues(1) = "0" tDxfCodes(2) = 0 tDxfValues(2) = "HATCH" tSSet.Select acSelectionSetAll, , , tDxfCodes, tDxfValues
>> alle auf einem Layer liegenden Objekte, die Flächen enthalten können >> (aber nicht müssen), auf Flächenfüllungen zu überprüfen Du hast in AutoCAD (ausgenommen beim Objekt MPolygon) kein Objekt, das gefüllt ist (gefüllt im Sinne von Schraffur innerhalb einer Umgrenzung). Du kannst auch für eine Schraffur nicht prüfen, von welchem Objekt diese abhängig ist, denn es kann ja sein, dass es 3 Bögen, eine Spline und 5 Linien gibt, die als Gesamtheit eine Umhüllende für die Schraffur ergeben. Damit wird die Aufgabendefinition von Dir zu überdenken sein. ------------------ www.hollaus.at |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 12. Okt. 2009 17:33 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 12. Okt. 2009 19:15 <-- editieren / zitieren -->
Hi, >> Ziel ist es alle Schraffuren zu löschen
ich bekomme (sorry gleich für Irrtum oben mit .Erase) mit folgendem Code die bestehenden Schraffuren gelöscht. Finde auch 'nur' die Schraffuren, mir werden beim Selektieren nichts anderes als die Schraffuren selektiert.
Code: Dim tSSet As AcadSelectionSet Dim tDxfCodes(1) As Integer Dim tDxfValues(1) As Variant On Error Resume Next Set tSSet = ThisDrawing.SelectionSets.Add("TEST") If (tSSet Is Nothing) Then Set tSSet = ThisDrawing.SelectionSets.Item("TEST") tSSet.Clear tDxfCodes(0) = 410 tDxfValues(0) = "Model" tDxfCodes(1) = 0 tDxfValues(1) = "HATCH" tSSet.Select acSelectionSetAll, , , tDxfCodes, tDxfValues Dim i As Integer For i = 0 To (tSSet.Count - 1) tSSet(i).Delete Next
>> Ziel ist es alle Schraffuren neu anzulegen
Ich hab schon oben erwähnt, wie soll herausgefunden werden, was schraffiert war? Du kannst zwar aus den Schraffuren ableiten, aus welchen geometrischen Begrenzungen diese erstellt wurde, aber nicht aus welchen Elementen in der Zeichnung. Selbst wenn Du die Loops der Schraffur auswertest und geometrisch mit bestehender Geometrie vergleichst, wirst Du keine vollständige Trefferquote erreichen (z.B. es könnten ja Linien übereinanderliegen in Deiner Zeichnung) und dazu kommt, dass Vergleich von Geometrieelementen nicht gerade der einfachst Job in der Programmierung ist. Kannst Du mal beschreiben, wozu Du Schraffuren löscht, die Du danach neu erstellst? Das leuchtet mir nicht ganz ein. - alfred - ------------------ www.hollaus.at |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 19. Okt. 2009 23:19 <-- editieren / zitieren --> Unities abgeben:
Hi alfred, hab hier mal zum besseren Verständnis meine Aufgabenstellung zusammengeschrieben. Workflow 2D-Längen- und 2D-Flächenermittlung: 1. Benutzereingabe: Objekte auf unterschiedlichen Layern erstellen (Polylinien, Kreise oder Ellipsen, Linien, Blockreferenzen, ....) Es gibt 3 Layerkategorien Längen, Flächen und Texte Ein Layer enthält also entweder nur Längen (-> Längen ermitteln) oder nur Flächen (-> Flächen ermitteln) oder nur Texte (-> wird nicht ausgewertet) Mischformen sind nicht zulässig 2. Alle geschlossenen Polylinien, Kreise und Ellipsen eigentlich alle Objekte, die 2D-Flächen darstellen können und die auf Layern, welche Flächen enthalten sollen, liegen mit Solids auf dem Layer farbig anlegen 3. Alle diese Flächen mit ihrer Größe auf Textlayer beschriften (Hier gibts ein gutes Lisp von Cadwiesel) Die Größe muss innerhalb der Fläche stehen (geht leider nicht mit dem Lisp). Längen müssen nicht geschrieben werden. 4. Dateiausgabe in Txt-Datei: Layername, Layerbezeichnung Alle Objektarten eines Layers mit Anzahl ausgeben (dient der Fehlererkennung in der Benutzereingabe) Alle Flächen und Längen je Layer in Datei ausgeben und Flächen und Längen je Layer und Objektart addieren (Geht schon) 5. Bei Polylinien auf Längenlayern zusätzlich ausgeben, wenn Radien <x Meter vorkommen, dazu den Radius und die Bogenlänge auflisten und über Bogenlängen mit gleichem Radius die Summe bilden 5. Benutzereingabe: Neue Flächenumfahrungen hinzufügen wegen Projekterweiterung/-änderung etc. 6. Alle Solids auf den Flächenlayern löschen und alle Flächenbeschriftungen löschen. 7. weiter bei 2. usw.
Wegen Punkt 5. lösche ich die Schraffuren, da ich nicht weiß, welche Polylinien etc. bereits Schraffuren haben und welche nicht. Es gibt keine Schraffuren, die aus mehreren Objekten entstanden sind. Falls es sie doch gibt, wäre es eine Fehleingabe und sie müssten gelöscht werden. Deinen Code oben probiere ich Morgen im Büro aus. ------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Okt. 2009 01:28 <-- editieren / zitieren -->
Hi Christian, bis auf ein paar Worte in Deiner ausführlichen Beschreibung hätte ich fast dazu geraten, dass Du Dir FDO ansehen solltest. Du kannst z.B. Deine Geometrie (Flächen- und Linienzuggeometrie) als SDF exportieren, dann über FDO referenzieren (diese Funktionalität ist in Map3D/Civil3D vorhanden) und da bestimmst Du über Stil die Füllungsmethode und die Beschriftung. Sprich es erstellt Dir die Schraffur für die Flächengeometrie selbst, und auch die Beschriftung kann das Ding ohne weitere Probleme. Wieso meinte ich oben 'fast dazu geraten': Weil Du Ellipsen erwähntest und das sind dann Splines auch nicht weit weg, da beginnt aber dann auch schon die Grenze zu dem, was GIS-Funktionen nicht mehr so gern mögen. Weiters hast Du geschrieben, dass Du Radien beschriften willst, auch das geht nicht mit Bordmitteln von FDO. Und wieso hab ich das trotzdem beschrieben: Da ich mir vorstellen könnte, dass Du Dir einen Haufen arbeit ersparst, wenn Du eingebaute Funktionen verwendest. Also siehe es einfach als Info, dass es da vielleicht in Deinem Civil3D Dinge gibt, die Deine Aufgaben im Bereich Flächen sehr simple und gleichzeitig sehr effektiv lösen könnte, schau's vielleicht an. Solltest Du das alles kennen, dann vergiss diesen Beitrag, aber ev. kann's wer anderer brauchen. - alfred - ------------------ www.hollaus.at |
otm Mitglied Bauingenieur
Beiträge: 167 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023 VBA Enabler 2023 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 22. Okt. 2009 12:17 <-- editieren / zitieren --> Unities abgeben:
Hi alfred, danke für die Hinweise. Hab mir FDO angeschaut, passt aber nicht in meine Arbeitsumgebung. Ich werd wohl noch ein paa Beiträge anstoßen um den o.g. Weg zu gehen. Gruß ------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |