Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Array (0 to -1)

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:  Array (0 to -1) (241 mal gelesen)
otm
Mitglied
Bauingenieur


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

Beiträge: 175
Registriert: 26.08.2009

MS Win 10
AutoCAD Civil 3D 2023
VBA Enabler 2023
MS Access Database Enginge X64
MSO 365 (64bit)

erstellt am: 05. Sep. 2023 21:59    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 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



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

Beiträge: 2698
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 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 otm 10 Unities + Antwort hilfreich

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


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

Beiträge: 175
Registriert: 26.08.2009

MS Win 10
AutoCAD Civil 3D 2023
VBA Enabler 2023
MS Access Database Enginge X64
MSO 365 (64bit)

erstellt am: 06. Sep. 2023 21: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

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 Sub

Public 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



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

Beiträge: 2698
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 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 otm 10 Unities + Antwort hilfreich

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


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

Beiträge: 175
Registriert: 26.08.2009

MS Win 10
AutoCAD Civil 3D 2023
VBA Enabler 2023
MS Access Database Enginge X64
MSO 365 (64bit)

erstellt am: 07. Sep. 2023 09:28    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 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 >>)

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