| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Array (0 to -1) (309 mal gelesen)
|
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 05. Sep. 2023 21:59 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich ermittle mit der Funktion IntersectWith einen Schnittpunkt zwischen einem Bogen objA und einem Strahl von Bogenzentrum durch einen Punkt X. Quasi den Lotfußpunkt (=intP) von X auf den Bogen, wenn der Pkt X im Öffnungswinkel des Bogens liegt. Code:
Dim intPt as Variant ... intPt = objA.IntersectWith(rayObj, acExtendNone) ...
Wenn es keinen Schnittpunkt gibt, wird als Typ für intP ermittelt "Variant/Double(0 to -1)" und als Wert ""<Keine Variablen>". Ist X identisch mit dem Bogenzentrum kann ich den Strahl nicht erzeugen (ist klar). Wie kann ich als Rückgabe den Typ und den Wert erzeugen, der bei "keinem Schnittpunkt" zurückgegeben wird?
------------------ Grüße aus München Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2812 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 06. Sep. 2023 13:03 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Zitat: Original erstellt von otm: Wie kann ich als Rückgabe den Typ und den Wert erzeugen, der bei "keinem Schnittpunkt" zurückgegeben wird?
Hallo, So ganz verstehe ich nicht was Du meinst. Soll ein Punkt auf dem Kreis erzeugt werden, wenn ein Bogen keinen Schnittpunkt ergibt? Oder soll intPt dann den Wert des Bogenmittelpunktes erhalten? Grüße Klaus [Edit] Möchtest Du nur wissen ob ein Schnittpunkt gefunden wurde, siehe Hilfe
Code: If VarType(intPt) <> vbEmpty Then
und danach prüfst du ob Werte vorhanden sind
Code:
If UBound(intpoints) >= 0 Then ' Hier die Schnittpunkte behandeln Else ' Kein Schnittpunkt gefunden End If
[Diese Nachricht wurde von KlaK am 06. Sep. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 06. Sep. 2023 21:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, ich verstehe den Rückgabewert von IntersectWith nicht, wenn kein Schnittpunkt vorliegt. Es wird ein Array mit Ubound(X) =-1 zurückgegeben. Also ein Array X(0 to -1). In der Hilfe wird das ausdrücklich ausgeschlossen, da -1 kleiner ist als 0. Wie kann ich so ein Array "händisch" erzeugen? Ich bräuchte das für eine folgende Abfrage. Gibt es da eine Möglichkeit? Hier noch die zwei Makros:
Code:
Sub GetLotPtOnArcTest() 'Punkt eingeben Dim arcObj As AcadArc, centerPt(0 To 2) As Double, radius As Double, WiStart As Double, WiEnd As Double Dim Pt(0 To 2) As Double 'Gegebener Punkt Dim dblS() As Double 'Lotfußpunkt (gesuchter Punkt) Dim intI As Integer 'Bogen im II.Quadranten centerPt(0) = 30: centerPt(1) = 30: centerPt(2) = 0 radius = 1 WiStart = 0.5 * Pi() WiEnd = Pi() Set arcObj = ThisDrawing.ModelSpace.AddArc(centerPt, radius, WiStart, WiEnd) 'Testdatensätze Pt(0) = 31: Pt(1) = 30: Pt(2) = 0 'Punkt liegt hinter dem Bogenzentrum exalt auf dem Radius -> dblS(0 to -1) Pt(0) = 29: Pt(1) = 30: Pt(2) = 0 'Punkt liegt vor dem Bogenzentrum exakt auf dem Bogen -> dblS(0 to 2) Pt(0) = 0: Pt(1) = 0: Pt(2) = 0 'Punkt liegt außerhalb des Bogenöffnungswinkels -> dblS(0 to -1) Pt(0) = 30: Pt(1) = 31: Pt(2) = 0 'Punkt liegt hinter dem Bogenzentrum exalt auf dem Radius -> dblS(0 to 2) Pt(0) = 29: Pt(1) = 31: Pt(2) = 0 'Punkt liegt innerhalb des Bogenöffnungswinkels, außerhalb des Bogens -> dblS(0 to 2) Pt(0) = 29.5: Pt(1) = 30.5: Pt(2) = 0 'Punkt liegt innerhalb des Bogenöffnungswinkels, innerhalb des Bogens -> dblS(0 to 2) Pt(0) = arcObj.Center(0): Pt(1) = arcObj.Center(1): Pt(2) = arcObj.Center(2) 'Punkt ist Bogenzentrum. Fehler entsteht in Variante 1. 'Variante 1: So sollte das sein dblS() = GetLotPtOnArc(arcObj, Pt()) intI = UBound(dblS) 'Erzeugt einen Fehler beim letzten Testdatensatz 'Variante 2: Hier wird GetLotPtOnArc doppelt ausgeführt. If VarType(GetLotPtOnArc(arcObj, Pt())) = vbEmpty Then intI = -1 Else dblS() = GetLotPtOnArc(arcObj, Pt()) intI = UBound(dblS) End If 'Ergebnis If intI = -1 Then MsgBox "Kein Schnittpunkt vorhanden" Else MsgBox "Schnittpunkt vorhanden. " 'dblS ist der Schnittpunkt End If End SubPublic Function GetLotPtOnArc(objA As AcadArc, PtC() As Double) As Variant 'Lotfußpunkt von C auf den Bogen A ermitteln Dim rayObj As AcadRay Dim PtZ() As Double Dim intPt As Variant PtZ() = objA.Center If PtZ(0) = PtC(0) And PtZ(1) = PtC(1) And PtZ(2) = PtC(2) Then 'Der angefragte Pkt C ist identisch mit dem Mittelpunkt Stop 'Ein sehr unwahrscheinlicher, aber möglicher Fall End If Else Set rayObj = ThisDrawing.ModelSpace.AddRay(PtZ, PtC) 'Schnittpunkt von Strahl und Bogen ermitteln intPt = objA.IntersectWith(rayObj, acExtendNone) 'Strahl wieder löschen rayObj.Delete End If GetLotPtOnArc = intPt End Function
Danke schon mal für's Mitdenken. ------------------ Grüße aus München Christian [Diese Nachricht wurde von otm am 06. Sep. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2812 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 07. Sep. 2023 09:23 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Hallo Christian, Keine Ahnung wie Du so ein Array (0 to -1) erzeugen kannst aber ich würde das anders aufbauen. Man kann die Function GetLotPtOnArc(objA As AcadArc, PtC() As Double) As Variant doch ändern zu: Function GetLotPtOnArc(objA As AcadArc, PtC() As Double, Lot() As Variant) As Boolean und setzt den Wert entsprechend. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 190 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 07. Sep. 2023 09:28 <-- editieren / zitieren --> Unities abgeben:
Danke für den Gedanken. Ich probier das mal heute Abend. ------------------ Grüße aus München Christian Edit: Hat geklappt. Vielen Dank nochmal.
[Diese Nachricht wurde von otm am 20. Sep. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|