Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  HybridShapes ohne gültige Lösung erkennen

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
Autor Thema:  HybridShapes ohne gültige Lösung erkennen (1841 mal gelesen)
pdrechsel
Mitglied


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

Beiträge: 2
Registriert: 29.10.2012

erstellt am: 29. Okt. 2012 13:46    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


Zwischenablage01.jpg

 
Guten Tag allerseits,

in einer Excel-Datei liegen die 2D-Koordinaten einer Punktewolke vor (x- und z-Koordinaten), diese möchte ich auf einer 3D-Fläche abbilden. Zu diesem Zweck importiere ich in CATIA über mein Makro die Punkte auf y = 0 und erzeuge Linien in y-Richtung. Wo sich diese Linien mit meiner 3D-Fläche schneiden liegen meine "Zielpunkte". Eine Projektion hat hier - warum auch immer - nicht geklappt: die Punkte wurden nicht exakt in y-Richtung projeziert und lagen somit irgendwo auf der Fläche...

Code:
Sub createPointsFromCSV()

    On Error GoTo hell
   
    Dim filename As String
    Dim foo As String, x As String, y As String, z As String
    Dim splitErgebnis As Variant
    Dim joinName As String
   
    'Geometrieelemente
    Dim myPart As Part
    Dim hysf As HybridShapeFactory
    Dim newPoint As Point 'neu eingelesener Punkt auf Grund csv-Datei
    Dim richtung As HybridShapeDirection 'Richtung für Schnittlinie
    Dim neueLinie As HybridShapeLinePtDir 'Schnittlinie
    Dim intersectPoint As HybridShapeIntersection
   
    'Geosets
    Dim linienBody As HybridBody
    Dim punkteBody As HybridBody
    Dim intersectBody As HybridBody
    Dim joinBody As HybridBody
   
    Dim rotWert As Long, gelbWert As Long
    Dim punktWert As Double

    'Selection wird zur Änderung der Farbeigenschaften benötigt
    Dim sel As Selection
  
  
   '#####Beginn#####
    'Dateinamen der csv-Datei erfragen, wenn "Abbruch", dann sub verlassen
    filename = CATIA.FileSelectionBox(".csv-Datei auswählen", "*.csv", CatFileSelectionModeOpen)
    If filename = "" Then Exit Sub
       
    Set myPart = CATIA.ActiveDocument.Part
    Set hysf = myPart.HybridShapeFactory
    Set sel = CATIA.ActiveDocument.Selection
    Set richtung = hysf.AddNewDirectionByCoord(0, -1, 0)
   
    Set linienBody = myPart.HybridBodies.Add
    Set punkteBody = myPart.HybridBodies.Add
    Set intersectBody = myPart.HybridBodies.Add
    Set legendeBody = myPart.HybridBodies.Add
   
    joinName = InputBox("Wie lautet das Geoset, das die Flächendaten zur Schnitterzeugung beinhaltet?")
    Set joinBody = myPart.HybridBodies.Item(joinName)
   
    linienBody.Name = "Linien"
    punkteBody.Name = "Punkte"
    intersectBody.Name = "Intersections"
    legendeBody.Name = "Legende"
   
    For Each strak In joinBody.HybridShapes
        Open filename For Input As #1
            Do While Not EOF(1)
                Line Input #1, foo
                'eingelesene Zeile zerlegen; Syntax: "X;Y;Z;PUNKTWERT"
                splitErgebnis = Split(foo, ";")
                x = CDbl(Val(splitErgebnis(0)))
                y = CDbl(Val(splitErgebnis(1)))
                z = CDbl(Val(splitErgebnis(2)))
                punktName = splitErgebnis(3)
               
        '##########Punkte erzeugen im Geo-Set "Punkte"##########################################
                Set newPoint = hysf.AddNewPointCoord(x, y, z)
                punkteBody.AppendHybridShape newPoint
        '########################################################################################
       
        '##########Linien erzeugen im Geo-Set "Linien"##########################################
                Set neueLine = hysf.AddNewLinePtDir(newPoint, richtung, 0, 2000, False)
                linienBody.AppendHybridShape neueLine
        '########################################################################################
       
        '##########neue Punkte auf Basis Intersect erzeugen im Geo-Set "Intersections"###########
                Set intersectPoint = hysf.AddNewIntersection(neueLine, strak)
                intersectBody.AppendHybridShape intersectPoint
               
                'jedes Element einzeln berechnen, sonst gibt es beim ersten Ungültigen einen
                'Update-Error
                intersectBody.HybridShapes.Item(intersectBody.HybridShapes.Count).Compute
                intersectPoint.Name = punktName
                          
                'Farbe ändern
                sel.Add intersectPoint
                punktWert = CDbl(Val(punktName))
                If Abs(punktWert) > 5 Then
                    rotWert = 255
                    gelbWert = 0
                Else
                   
                    gelbWert = 255 - Abs(punktWert) * 255 / STUFIGKEIT_FARBUNTERSCHEIDUNG
                End If
                sel.VisProperties.SetRealColor 255, gelbWert, 0, 1
                sel.Clear
        '########################################################################################
            Loop
        Close #1
    Next
    'Selection leeren
    sel.Clear
   
    'nicht benötige Geosets in's no-show schicken
    sel.Add linienBody
    sel.Add punkteBody
    sel.VisProperties.SetShow catVisPropertyNoShowAttr
   
    'Selection leeren, danach Legende erzeugen
    sel.Clear
    For i = 1 To STUFIGKEIT_FARBUNTERSCHEIDUNG
        Set legendeFeld = hysf.AddNewExtrude( _
            hysf.AddNewLinePtDir(hysf.AddNewPointCoord(0, 0, -100 - (i - 1) * 100), hysf.AddNewDirectionByCoord(0, 0, -1), 0, 80, False) _
                , 80, 0, hysf.AddNewDirectionByCoord(0, 1, 0))
        legendeBody.AppendHybridShape legendeFeld
        legendeBody.HybridShapes.Item(legendeBody.HybridShapes.Count).Compute
       
        gelbWert = 255 - 255 / i
        sel.Add legendeFeld
        sel.VisProperties.SetRealColor 255, gelbWert, 0, 1
        sel.Clear
    Next i
    myPart.Update
   
    Exit Sub
   
hell:

    MsgBox "Fehler!" & vbCrLf & Err.Description, vbCritical
End Sub


Soweit so gut, das Makro tut auch was es soll, allerdings ist die zu Grunde liegende Excel-Datei teilweise etwas unsauber. Es kann vorkommen, dass es für die Intersection-Operation keine Lösung gibt, da die Linie die Fläche nicht schneidet.

Ich finde nun keine Möglichkeit, auf diese nicht-lösbaren HybridShapes (Darstellung siehe Anhang) zu prüfen, um sie wieder aus dem Baum raus zu werfen   Ein Durchgehen von Hand ist nicht möglich, da es sich um mehrere Tausend Punkte handeln kann...

Kennt hier jemand eine Möglichkeit? Wenn jemand eine grundsätzlich bessere Idee hat, wie man das Problem lösen kann bin ich natürlich dankbar  

Gruß,
Peter

[Diese Nachricht wurde von pdrechsel am 29. Okt. 2012 editiert.]

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

bgrittmann
Moderator
Konstrukteur


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

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 29. Okt. 2012 13:54    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 pdrechsel 10 Unities + Antwort hilfreich

Servus
Du könntest nach jedem erzeugen einer Verschneidung ein "UpdateObject" ausführen (ggf zuvor Fehlerbehandlung ausschalten "On Errro Resume next") und dann die Fehlernummer abfragen (if Err.Number <>= then).
Falls ein Fehler vorliegt die letzte Verschneidung löschen.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

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

pdrechsel
Mitglied


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

Beiträge: 2
Registriert: 29.10.2012

erstellt am: 30. Okt. 2012 07:35    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 Bernd,

besten Dank, das war die Lösung! Manchmal sieht man den Wald vor lauter Bäumen nicht. Ich hatte zwischenzeitlich das "On Error Resume Next" bereits drin und bin dann verzweifelt, weil bei fehlerhaften Operationen keine Fehler geworfen werden 

Jetzt bin ich glücklich und zufrieden!

Gruß,
Peter

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

bgrittmann
Moderator
Konstrukteur


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

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 30. Okt. 2012 07:36    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 pdrechsel 10 Unities + Antwort hilfreich

Servus
Denk daran, dass du die Fehlerbehandlung wieder einschalten solltest (on Error goto 0).
Sonst suchst du dir bei einer Fehlfunktion (ohne Fehlermeldung) einen Wolf.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

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



Entwicklungsingenieur Pumpentechnik (m/w/d) Schwerpunkt Food/Pharma/Cosmetics

ViscoTec Pumpen- und Dosiertechnik GmbH ist spezialisiert auf die Herstellung von Anlagen und Komponenten aller Art, die zur Förderung, Dosierung, Auftragung, Abfüllung und Entnahme von viskosen Medien dienen. Die Produkte kommen in unterschiedlichen Branchen zum Einsatz, beispielsweise in der Pharma-, Lebensmittel- oder Kosmetikindustrie. ViscoTec Stellenangebote suchen nach qualifizierten Mitarbeitern ...

Anzeige ansehenEntwicklung
rfriedrich
Mitglied



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

Beiträge: 39
Registriert: 11.05.2005

erstellt am: 01. Nov. 2012 13:22    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 pdrechsel 10 Unities + Antwort hilfreich

Wenn die Projektion "irgendwo" auf der Fläche landet ist vermutlich die Projektionsrichtung "normal zur Fläche" aktiv, sprich es wird der kürzeste Abstand zwischen Punkt und Fläche verwendet. Das wird auch verwendet, wenn mit "AddNewProject" projiziert wird. Im Project-Feature kann man aber eine Richtung angeben (in diesem Falle Y). Das geht programmiertechnisch nur nach der Erzeugung des Features mit .Direction.

Die Fehlerüberprüfung muss aber trotzdem gemacht werden.


Gruß
Roland

[Diese Nachricht wurde von rfriedrich am 01. Nov. 2012 editiert.]

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