| |
| KISTERS 3DViewStation: Mehr CAD Lizenzen durch 3D-Viewer ersetzen und Geld sparen, eine Pressemitteilung
|
Autor
|
Thema: Alle Pad - Kanten automatisch mit Radius runden (2369 / mal gelesen)
|
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 04. Jan. 2018 06:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen Wie kann ich alle Pad - Kanten automatisch mit Radius runden? Ich meine: ich zeige ein Pad Face (mit SelectElement2) und ich möchte ale senkrechte Kanten zu dem Pad runden mit Radius z.B. 5mm.... Jemand kann mir Richtung geben? Ich habe gedacht, dass ich muss prüfen, ob Richtung der Kante parallel zu Ebene(Face) Richtung ist... Is das Das Weg? Ich habe folgende Funktion im Netz gefunden:
Code: Public Function LLIntersect(A As iPct, B As iPct, C As iPct, D As iPct) As iIntersect Dim M(3, 3) As Double M(0, 0) = A.x: M(0, 1) = A.y: M(0, 2) = A.z: M(0, 3) = 1 M(1, 0) = B.x: M(1, 1) = B.y: M(1, 2) = B.z: M(1, 3) = 1 M(2, 0) = C.x: M(2, 1) = C.y: M(2, 2) = C.z: M(2, 3) = 1 M(3, 0) = D.x: M(3, 1) = D.y: M(3, 2) = D.z: M(3, 3) = 1 If GetDet(M) <> 0 Then Erase M: LLIntersect.Result = Oblice: Exit Function 'skew lines Dim CxB() As Double: Dim AxB() As Double: ReDim CxB(2): ReDim AxB(2) Dim Av(2) As Double: Dim Bv(2) As Double: Dim Cv(2) As Double Av(0) = B.x - A.x: Av(1) = B.y - A.y: Av(2) = B.z - A.z Bv(0) = D.x - C.x: Bv(1) = D.y - C.y: Bv(2) = D.z - C.z Cv(0) = C.x - A.x: Cv(1) = C.y - A.y: Cv(2) = C.z - A.z CxB = CrossProd(Cv, Bv): AxB = CrossProd(Av, Bv) Dim s As Double On Error GoTo paralelele s = DotProd(CxB, AxB) / Abs(DotProd(AxB, AxB)) Dim iInter As iPct iInter.x = A.x + Av(0) * s 'X coordinate of intersection iInter.y = A.y + Av(1) * s 'Y coordinate of intersection iInter.z = A.z + Av(2) * s 'Z coordinate of intersection LLIntersect.Result = Intersectie 'intersecting lines LLIntersect.Val = iInter paralelele: Erase CxB: Erase AxB: Erase Cv: Erase Bv: Erase Av If Err.Number <> 0 Then LLIntersect.Result = PParalele: Err.Clear 'parallel lines End Function
Aber ich kann leider nicht weitergehen.... kann mir jemand helfen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 04. Jan. 2018 09:09 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
Servus Sylas Also ich würde es mal so probieren: - Fläche vom User selektieren und zwischenspeichern - per Search alle Kanten des Pads suchen (zB .Search "Topology.CGMEdge,sel") - Selektion überprüfen ob die Kanten senkrecht (bzw nicht parallel) zur Fläche sind - Verrundung erzeugen Die Überprüfung könntest du zB über eine Messung machen. (Winkel, oder Vektorrechnung) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 04. Jan. 2018 17:22 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bgrittmann: Servus SylasAlso ich würde es mal so probieren: - Fläche vom User selektieren und zwischenspeichern - per Search alle Kanten des Pads suchen (zB [i].Search "Topology.CGMEdge,sel") - Selektion überprüfen ob die Kanten senkrecht (bzw nicht parallel) zur Fläche sind - Verrundung erzeugen Die Überprüfung könntest du zB über eine Messung machen. (Winkel, oder Vektorrechnung) Gruß Bernd [/i]
Hallo Bernd Zur Zeit, ich hatte nur die Ebenegleichung gerechnet... Ist das die Vektor der Ebene? Wenn ja, dann mit der Funktion ich kann zwei Vektoren vergleichen, ob sie parallel sind, richtig? Wenn nicht ganz, dann wie? Mit Winkelmessung muss ich das drei Mal rechnen, oder? Ich entschuldige mich für mein Deutsch - wie immer Gruß Lucas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 04. Jan. 2018 17:46 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
Servus Meine Idee war eher so (ungetestet): - aus der Fläche (Plane oder PlanarFace) ein Measurable erstellen - dann mittels GetAngleBetween den Winkel zu den Kanten messen Falls du das über eine Vektorrechnung machen willst, könnte es so gehen: - Normalenrichtung der Ebene bestimmen (Kreuzprodukt bzw Vektorprodukt) - diese Richtung mit den Richtungsvektoren der Kanten vergleichen (bzw Kreuzprodukt des Normalenvektors zum Richtungsvektor = 0) Gruß Bernd EDIT: Hinweis zum Kreuzprodukt ergänzt. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 04. Jan. 2018 21:37 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bgrittmann: ServusMeine Idee war eher so (ungetestet): - aus der Fläche (Plane oder PlanarFace) ein Measurable erstellen - dann mittels GetAngleBetween den Winkel zu den Kanten messen Falls du das über eine Vektorrechnung machen willst, könnte es so gehen: - Normalenrichtung der Ebene bestimmen (Kreuzprodukt bzw Vektorprodukt) - diese Richtung mit den Richtungsvektoren der Kanten vergleichen (bzw Kreuzprodukt des Normalenvektors zum Richtungsvektor = 0) Gruß Bernd EDIT: Hinweis zum Kreuzprodukt ergänzt.
Ich habe nur gewusst, dass wenn eine Ebene zwei Richtungen hat X,Y dann ich soll der Winkel zum zwei Richtungen messen, oder? Die Kante kann auch im zwei Richtungen "gedreht" sein (skewed), oder? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 04. Jan. 2018 23:26 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 05. Jan. 2018 09:49 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
Hi Sylas Ich hab mal so ein Makro zusammengebastelt wie ich das ganze angehen würde: Code: Sub CATMain()Dim oPartDocument As PartDocument dim oPart as Part Dim oShapeFactory As Factory Dim oSel as Selection dim oPlaneRef as Reference dim oPad as Pad dim Filter() Dim Status as String Dim TheSPAWorkbench As Object Dim TheMeasurable As Measurable Dim dAngle as double Dim constRadEdgeFillet1 As ConstRadEdgeFillet Set oPartDocument = CATIA.ActiveDocument Set oSel = oPartDocument.Selection Set oPart = oPartDocument.Part Set oShapeFactory = oPart.ShapeFactory Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") 'Select Pad Redim Filter(0) Filter(0) = "Pad" Status = oSel.SelectElement2(Filter, "Please select a pad", False) if Status <> "Normal" then exit Sub end if Set oPad = oSel.item2(1).Value oSel.Clear 'Select reference face Filter(0) = "PlanarFace" Status = oSel.SelectElement2(Filter, "Please select a reference face", False) if Status <> "Normal" then exit Sub end if Set oPlaneRef = oSel.item2(1).Reference oSel.Clear 'search for edges and check them oSel.add oPad oSel.Search "Topology.CGMEdge,sel" Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oPlaneRef) for i = oSel.count2 to 1 Step -1 'a check if the current edge is a line is missing dAngle = TheMeasurable.GetAngleBetween(oSel.item2(i).Reference) if dAngle <> 90 then osel.Remove2(i) end if next 'create fillet if osel.count2 <> 0 then oPart.InWorkObject = oPad.parent Set constRadEdgeFillet1 = oShapeFactory.AddNewSolidEdgeFilletWithConstantRadius(nothing, catTangencyFilletEdgePropagation, 5.000000) for i = 1 to osel.count2 constRadEdgeFillet1.AddObjectToFillet osel.item2(i).reference next oPart.Update end if End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 10. Jan. 2018 13:11 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd Alles funktioniert super! Ich habe nur ein kleines Änderung gemaht: SelectElement2 hat mir ein Restricted Interface Fehler gegeben, deshalb habe ich das so :
Code:
Dim sSel As Object Set sSel = oSel... Status = sSel.SelectElement2(Filter, "Wybierz pada", False)
gelöst und ich hatte das Makro ein bischen mehr interactiv mit: Code:
Dim Radius As Double Radius = InputBox("Podaj promien", "Promien zaokraglenia", 3)... Set constRadEdgeFillet1 = oShapeFactory.AddNewSolidEdgeFilletWithConstantRadius(Nothing, catTangencyFilletEdgePropagation, Radius)
gemacht. Noch Mal - viellen Dank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 26. Feb. 2018 11:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd Noch Mal zuruck zum Code:
Code: Sub CATMain() Dim oPartDocument As PartDocument Dim oPart As Part Dim oShapeFactory As Factory Dim oSel As Selection Dim oPlaneRef As Reference Dim oPad As Pad Dim Filter() Dim Status As String Dim TheSPAWorkbench As Object Dim TheMeasurable As Measurable Dim dAngle As Double Dim constRadEdgeFillet1 As ConstRadEdgeFilletSet oPartDocument = CATIA.ActiveDocument Set oSel = oPartDocument.Selection Set oPart = oPartDocument.Part Set oShapeFactory = oPart.ShapeFactory Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") 'Select Pad ReDim Filter(0) Filter(0) = "Pad" Dim sSel As Object Set sSel = oSel Status = sSel.SelectElement2(Filter, "Wybierz pada", False) If Status <> "Normal" Then Exit Sub End If Set oPad = oSel.Item2(1).Value oSel.Clear 'Select reference face Filter(0) = "PlanarFace" Status = sSel.SelectElement2(Filter, "Please select a reference face", False) If Status <> "Normal" Then Exit Sub End If Set oPlaneRef = oSel.Item2(1).Reference oSel.Clear 'search for edges and check them oSel.Add oPad oSel.Search "Topology.CGMEdge,sel" Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oPlaneRef) For i = oSel.Count2 To 1 Step -1 'a check if the current edge is a line is missing dAngle = TheMeasurable.GetAngleBetween(oSel.Item2(i).Reference) If dAngle <> 90 Then oSel.Remove2 (i) End If Next 'create fillet If oSel.Count2 <> 0 Then oPart.InWorkObject = oPad.Parent Dim Radius As Double Radius = InputBox("Podaj promien", "Promien zaokraglenia", 3) Set constRadEdgeFillet1 = oShapeFactory.AddNewSolidEdgeFilletWithConstantRadius(Nothing, catTangencyFilletEdgePropagation, Radius) For i = 1 To oSel.Count2 constRadEdgeFillet1.AddObjectToFillet oSel.Item2(i).Reference Next oPart.Update End If End Sub
Es gibt mir Fehlermeldung mit Update - "Feature involved in an update cycle" wenn ein Part assemblies hat.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 26. Feb. 2018 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
Servus Liegt scheinbar daran dass die Referenzen zur Boole'schen Operation gebildet wird und nicht zum Pad. Also statt "Pad.1/Edge.1" "Assemble.1/Edge.33". Keine Ahnung wie man dies verhindern/bereinigen kann. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 26. Feb. 2018 12:28 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bgrittmann: ServusLiegt scheinbar daran dass die Referenzen zur Boole'schen Operation gebildet wird und nicht zum Pad. Also statt "Pad.1/Edge.1" "Assemble.1/Edge.33". Keine Ahnung wie man dies verhindern/bereinigen kann. Gruß Bernd
Das ist echt Schade... Vielleicht können wir das zeitweilig aus dem Assembly ausschneiden, ein Fillet machen, und wieder Assembly machen? [Diese Nachricht wurde von Sylas am 26. Feb. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KADv5 Mitglied Ingenieur
Beiträge: 13 Registriert: 22.01.2018 Intel Xeon E5-2643 3,4Ghz 12,0 GB Ram Win 7 Enterprise 64-bit Catia V5R26 SP3 HF21
|
erstellt am: 26. Feb. 2018 14:28 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
|
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 26. Feb. 2018 15:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von KADv5: Vielleicht könnte man das auch in einer zusätzlichen Abfrage erzeugen Stichwort:Code: If Body.InBooleanOperation = False Then
Hallo KADv5 Kannst du das bitte erweitern was meinst du genau? Wo soll ich diese Abfrage stellen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 26. Feb. 2018 15:39 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
Servus Das ist nur ein Baustein um festzustellen ob der betreffende Körper in einer booleschen Operation verwendet wird. Das Problem mit der Referenzbildung ist damit nicht abgedeckt. Da musst du dir noch eine Lösung einfallen lassen (rumprobieren) Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sylas Mitglied
Beiträge: 349 Registriert: 19.11.2012 Dell Precision T3500 Intel Xeon W3550 @ 3,07 GHz 12 GB RAM CATIA V5 R28
|
erstellt am: 22. Mrz. 2018 07:03 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 22. Mrz. 2018 16:34 <-- editieren / zitieren --> Unities abgeben: Nur für Sylas
Servus Sylas Rentiert sich denn der Aufwand? Im GSMD geht dies doch schon mit wenigen Klicks (in der Funktion Ecke kann man alle konkave/konvexe selektieren lassen) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |