Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Per VBA Mittelpunkt Polygon

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:  Per VBA Mittelpunkt Polygon (2376 / mal gelesen)
Andre B.
Mitglied
Sachbearbeiter und Zeichner


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

Beiträge: 19
Registriert: 04.02.2018

Win 10 64bit
Access 2016
AutoCAD 2018
AutoCAD MEP 2018

erstellt am: 20. Mrz. 2018 14: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 liebe Gemeinschaft,

mittlerweile versuche ich mich ins Programmieren von AutoCAD mit VBA reinzuarbeiten  . Bin nun aber auf ein neues Problem gestoßen, welches ich durch meine Denkweise und Google nicht gelöst bekomme:

Ich habe eine Polylinie im Plan, wobei ich alle Punkte des Polygons kenne. Ich kenne auch die HandleID, um es anzusprechen, bzw. zu identifizieren.
Nun würde ich gerne in den "Geometrischen Mittelpunkt" einen Block setzen. Das setzen des Blocks ist mal außen vor, da ich das schon umgesetzt habe, jedoch finde ich keine Funktion oder Option, um dieses "Geometrische Zentrum" des Polygons zu ermitteln.

Das Polygon ist geschlossen, hat häufig mehr als 4 Ecken und kann jede beliebige Form annehmen (mit vier Ecken wäre es einfach durch eine mathematische Berechnung umsetzbar).

Es würde auch reichen, wenn ich den Block irgendwie im Polygon platziere, wenn der Mittelpunkt nicht als VBA-Funktion zur Verfügung steht.

mfg

André 

------------------
Die meisten Probleme entstehen bei ihrer Lösung.
------------------------------------------------

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2008 Mechanical

erstellt am: 20. Mrz. 2018 15:17    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 Andre B. 10 Unities + Antwort hilfreich

Was ist bei dir der "Geometrische Mittelpunkt"  .. Linienschwerpunkt, Flächenschwerpunkt , arithmetisches Mittel aller Stützpunktkoordinaten ?
Diese müssen aber nicht zwingend innerhalb der Kontur liegen ..

Wozu brauchst du später diesen Punkt? Wäre es nicht sinnvoller den Mittelpunkt des von der Funktion Boundingbox zurückgelieferten Rechtecks zu nehmen oder einfach einen Punkt auf der Kontur ?

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - 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

Andre B.
Mitglied
Sachbearbeiter und Zeichner


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

Beiträge: 19
Registriert: 04.02.2018

Win 10 64bit
Access 2016
AutoCAD 2018
AutoCAD MEP 2018

erstellt am: 21. Mrz. 2018 07: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

Ich habe im Plan eine Raumkontur, welche durch ein Vieleck dargestellt ist. In diese Kontur würde ich gern Blöcke setzen.

"Boundingbox" als Befehl kannte ich noch nicht. Kann ich den auf alle AutoCAD-Objekte anwenden?

------------------
Die meisten Probleme entstehen bei ihrer Lösung.
------------------------------------------------

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: 2624
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 21. Mrz. 2018 08:09    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 Andre B. 10 Unities + Antwort hilfreich

Hallo André,

object.GetBoundingBox MinPoint, MaxPoint
ist für alle Zeichnungselemente definiert aber Du solltest danach noch testen ob der Punkt auch wirklich innerhalb der Fläche liegt z.B. über den "Punkt in Polygon Test"

Neben der BoundingBox gäbe es noch die Möglichkeit das Polygon in eine Region umzuwandeln und sich die Centroid-Koordinaten zu holen, aber auch hier kann bei L- oder C-förmigen Flächen der Schwerpunkt außerhalb liegen.

Daneben gibt es noch andere Ansätze z.B. das Vernetzen der Fläche über Dreieckslinien und setzen des Punktes auf den Mittelpunkt der längsten Dreieckseite

Grüße
Klaus 

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

Andre B.
Mitglied
Sachbearbeiter und Zeichner


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

Beiträge: 19
Registriert: 04.02.2018

Win 10 64bit
Access 2016
AutoCAD 2018
AutoCAD MEP 2018

erstellt am: 22. Mrz. 2018 11: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

Super. Passt. Dann nur noch den Mittelpunkt bestimmen.

Code:
tAcadPoly.GetBoundingBox PosMin, PosMax
varX = (PosMin(0) + PosMax(0)) / 2
varY = (PosMin(1) + PosMax(1)) / 2
                       
InsertPnt(0) = varX
InsertPnt(1) = varY
InsertPnt(2) = 0#

Vieln Dank.

------------------
Die meisten Probleme entstehen bei ihrer Lösung.
------------------------------------------------

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: 2624
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 22. Mrz. 2018 12:40    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 Andre B. 10 Unities + Antwort hilfreich

Sollte für die meisten Fälle passen außer für die oben erwähnten Polygone in L- oder C-Form, weshalb es immer sinnvoll ist den Punkt-in-Polygon-Test trotzdem durchführen zu lassen wenn man wirklich sicher sein will dass der Punkt auch innerhalb ist.

Grüße
Klaus 

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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

Various: systems, Operating systems, cad systems, cad versions, programming languages.

erstellt am: 14. Apr. 2018 14:18    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 Andre B. 10 Unities + Antwort hilfreich

Hi,

So wird das nix  
Bounding Box klappt nur bei an Koordinatenkreuz ausgerichteten Wänden rechtwinkligen Querschnitts  
Und da das Koordinaten ermitteln lästig ist, hab ich die Routine hierfür mit dreingegeben. ACAD kennt ja mehr als nur eine Polygontype.

Polygon Länge, Fläche, Flächenschwerpunkt sowie die Trägheitsmomente gibt es ebenfalls dazu 

Lieben Gruß
Thomas

Public Type POINT3D
    X As Double
    Y As Double
    Z As Double

End Type

Function POLY_INFO(POINTS() As Point3d, CENTROID As Point3d, ix As Double, iy As Double, IXY As Double, LENGTH As Double) As Double

    Dim N As Long
    Dim I_NEXT As Long
    Dim I_CURRENT As Long
    Dim DX As Double
    Dim DY As Double
Dim AREA As Double
    AREA = 0: CX = 0: CY = 0: ix = 0: iy = 0: IXY = 0: LENGTH = 0
    N = UBound(POINTS) + 1

    I_CURRENT = N
    For I_NEXT = 0 To N - 1

        DX = POINTS(I_NEXT).X - POINTS(I_CURRENT).X
        DY = POINTS(I_NEXT).Y - POINTS(I_CURRENT).Y
        LENGTH = LENGTH + Sqr(DX * DX + DY * DY)

        AREA = AREA + (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y - POINTS(I_NEXT).X * POINTS(I_CURRENT).Y)
        CENTROID.X = CENTROID.X + (POINTS(I_CURRENT).X + POINTS(I_NEXT).X) * (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y - POINTS(I_NEXT).X * POINTS(I_CURRENT).Y)
        CENTROID.Y = CENTROID.Y + (POINTS(I_CURRENT).Y + POINTS(I_NEXT).Y) * (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y - POINTS(I_NEXT).X * POINTS(I_CURRENT).Y)
        ix = ix + (POINTS(I_CURRENT).Y ^ 2 + POINTS(I_CURRENT).Y * POINTS(I_NEXT).Y + POINTS(I_NEXT).Y ^ 2) * (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y - POINTS(I_NEXT).X * POINTS(I_CURRENT).Y)
        iy = iy + (POINTS(I_CURRENT).X ^ 2 + POINTS(I_CURRENT).X * POINTS(I_NEXT).X + POINTS(I_NEXT).X ^ 2) * (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y - POINTS(I_NEXT).X * POINTS(I_CURRENT).Y)
        IXY = IXY + (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y + 2 * POINTS(I_CURRENT).X * POINTS(I_CURRENT).Y + 2 * POINTS(I_NEXT).X * POINTS(I_NEXT).Y + POINTS(I_NEXT).X * POINTS(I_CURRENT).Y) * (POINTS(I_CURRENT).X * POINTS(I_NEXT).Y - POINTS(I_NEXT).X * POINTS(I_CURRENT).Y)
        I_CURRENT = I_NEXT
    Next

    AREA = AREA * 0.5
    If AREA <> 0 Then
        CENTROID.X = CENTROID.X / (6 * AREA)
        CENTROID.Y = CENTROID.Y / (6 * AREA)
    End If
    ix = ix / 12
    iy = iy / 12
    IXY = IXY / 24

    POLY_INFO = AREA
End Function


Function POINTS_FROM_POLYLINE(ByRef POINTS() As Point3d, entity As AcadEntity) As Long
    Dim V As Variant
    Dim I As Long
    Dim J As Long

    Dim POINTCOUNT As Long
    Dim polylw As AcadLWPolyline
    Dim poly3d As Acad3DPolyline
    Dim poly2d As AcadLWPolyline
    Dim polym As AcadMLine
   

    Dim polyAC As AcadPolyline
    Dim Line As acadline
    Dim spline As AcadSpline
    Dim LEADER As AcadLeader
    Dim MLEADER As ACADOBJECT 'AcadMleader
    Dim face As Acad3DFace
    Dim closed As Boolean

    Dim S As String
   
    DoEvents
   
    POINTS_FROM_POLYLINE = -1
    S = LCASE(entity.objectname)
    J = 0
    closed = False
    If entity Is Nothing Then Exit Function

    Select Case S


        Case "acdbline"
            Set Line = entity
            ReDim POINTS(1)
            POINTS(0).X = Line.startPoint(0)
            POINTS(0).Y = Line.startPoint(1)
            POINTS(0).Z = Line.startPoint(2)

            POINTS(1).X = Line.endPoint(0)
            POINTS(1).Y = Line.endPoint(1)
            POINTS(1).Z = Line.endPoint(2)
            POINTCOUNT = 1


        Case "acdblwpolyline"

            Set polylw = entity
            closed = polylw.closed
            V = polylw.COORDINATES
            POINTCOUNT = ((UBound(V) + 1) / 2) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                POINTS(I).X = polylw.COORDINATES(J): J = J + 1
                POINTS(I).Y = polylw.COORDINATES(J): J = J + 1
            Next

            POINTS_FROM_POLYLINE = POINTCOUNT

        Case "acdbpolyline"
            V = entity.COORDINATES

            POINTCOUNT = ((UBound(V) + 1) / 2) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            Set polylw = entity
            closed = polylw.closed
            For I = 0 To POINTCOUNT

                POINTS(I).X = polylw.COORDINATES(J): J = J + 1
                POINTS(I).Y = polylw.COORDINATES(J): J = J + 1
                POINTS(I).Z = polylw.ELEVATION
                'POINTS(i).z = polylw.COORDINATES(j): j = j + 1
                '            points(i).z = polyLW.coordinates(J): J = J + 1
            Next
 
 
        Case "acdb2dpolyline"

            Set polyAC = entity
            closed = polyAC.closed
            V = entity.COORDINATES
            ' pointCount = ((UBound(v) + 1) / 2) - 1
            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                POINTS(I).X = polyAC.COORDINATES(J): J = J + 1
                POINTS(I).Y = polyAC.COORDINATES(J): J = J + 1
                POINTS(I).Z = polyAC.COORDINATES(J): J = J + 1
                POINTS(I).Z = polyAC.ELEVATION
            Next
            POINTS_FROM_POLYLINE = POINTCOUNT
 
        Case "acdb3dpolyline"

            Set Acad3DPolyline = entity
            closed = Acad3DPolyline.closed
            V = entity.COORDINATES
            ' pointCount = ((UBound(v) + 1) / 2) - 1
            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                POINTS(I).X = V(J): J = J + 1
                POINTS(I).Y = V(J): J = J + 1
                POINTS(I).Z = V(J): J = J + 1
              
            Next
            POINTS_FROM_POLYLINE = POINTCOUNT


        Case "acdbface"

            Set face = entity
            closed = False
            V = face.COORDINATES
            ' pointCount = ((UBound(v) + 1) / 2) - 1
            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                POINTS(I).X = face.COORDINATES(J): J = J + 1
                POINTS(I).Y = face.COORDINATES(J): J = J + 1
                POINTS(I).Z = face.COORDINATES(J): J = J + 1
            Next
            POINTS_FROM_POLYLINE = POINTCOUNT

    

        Case "acdbmline"
            V = entity.COORDINATES

            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            Set polym = entity
               
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                POINTS(I).X = polym.COORDINATES(J): J = J + 1
                POINTS(I).Y = polym.COORDINATES(J): J = J + 1
                POINTS(I).Z = polym.COORDINATES(J): J = J + 1
            Next

        Case "acdbleader"
            V = entity.COORDINATES

            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            'Set leader = entity
               
            ReDim POINTS(POINTCOUNT)
  
            For I = 0 To POINTCOUNT
                POINTS(I).X = V(J): J = J + 1
                POINTS(I).Y = V(J): J = J + 1
                POINTS(I).Z = V(J): J = J + 1
            Next

        Case "_acdbmleader"
            Dim MLEAD As AcadMleader
            Set MLEAD = entity
            'V = MLEAD.COORDINATES

            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            'Set leader = entity
               
            ReDim POINTS(POINTCOUNT)
  
            For I = 0 To POINTCOUNT
                POINTS(I).X = V(J): J = J + 1
                POINTS(I).Y = V(J): J = J + 1
                POINTS(I).Z = V(J): J = J + 1
            Next


        Case "acdb3dpolyline"
            Set poly3d = entity
            closed = poly3d.closed
            V = poly3d.COORDINATES
            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                POINTS(I).X = poly3d.COORDINATES(J): J = J + 1
                POINTS(I).Y = poly3d.COORDINATES(J): J = J + 1
                POINTS(I).Z = poly3d.COORDINATES(J): J = J + 1
            Next
      
        Case "acdbspline"
            Set spline = entity
     
            spline.SplineMethod = acFit
            V = spline.fitPoints
            POINTCOUNT = ((UBound(V) + 1) / 3) - 1
            ReDim POINTS(POINTCOUNT)

            For I = 0 To POINTCOUNT
                POINTS(I).X = spline.fitPoints(J): J = J + 1
                POINTS(I).Y = spline.fitPoints(J): J = J + 1
                POINTS(I).Z = spline.fitPoints(J): J = J + 1
            Next
       

        Case "acdbsection"
            Dim SECT As AcadSection
            Set SECT = entity
            closed = False
           
            POINTCOUNT = SECT.NumVertices - 1
           
           
           
           
           
           
           
            ReDim POINTS(POINTCOUNT)
            ''debug.print  pointcount
            For I = 0 To POINTCOUNT
                V = SECT.COORDINATE(I)
                POINTS(I).X = V(0)
                POINTS(I).Y = V(1)
                POINTS(I).Z = V(2)
            Next
            closed = False

    End Select
   
    If closed Then
        POINTCOUNT = POINTCOUNT + 1
        ReDim Preserve POINTS(POINTCOUNT)
        POINTS(POINTCOUNT) = POINTS(0)
    End If
   
    POINTS_FROM_POLYLINE = POINTCOUNT + 1
End Function

------------------
Wer es nicht versucht, hat schon verlorn  
Und bei 3 Typos gibts den vierten gratis !
<<< for sale !

[Diese Nachricht wurde von rexxitall am 14. Apr. 2018 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: 2624
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 15. Apr. 2018 11: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 Nur für Andre B. 10 Unities + Antwort hilfreich


20180414-PL_Test.jpg

 
Hallo Rexxitall,

Nette Funktion, wenn auch nicht das was André braucht. Außerdem hast Du noch einen Fehler drin:

Code:
Function POLY_INFO(POINTS() As Point3d, CENTROID As Point3d, ix As Double, iy As Double, IXY As Double, LENGTH As Double) As Double

    N = UBound(POINTS) + 1
    I_CURRENT = N
    For I_NEXT = 0 To N - 1

        DX = POINTS(I_NEXT).X - POINTS(I_CURRENT).X
        DY = POINTS(I_NEXT).Y - POINTS(I_CURRENT).Y



Hier weißt I_Current auf ein nicht existentes Element
Hier sollte bei N das +1 wegfallen, falls dies für die restliche Auswertung (habe jetzt nicht alles analysiert) möglich ist.

Wie im beiliegenden Screenshot dargestellt sind die Centroidkoordinaten bei gewissen Formen auch außerhalb

Grüße
Klaus

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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

Various: systems, Operating systems, cad systems, cad versions, programming languages.

erstellt am: 15. Apr. 2018 14:38    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 Andre B. 10 Unities + Antwort hilfreich

Hi Klak
Danke für den Hinweis mit dem Fehler, gugg ich mir an.
Das bei bestimmten Polygonzügen der Flächenschwerpunkt ausserhalb liegt ist richtig. Das liegt an der Natur der Sache. Kann man in jedem Mechanik Buch nachlesen 

Was manch einer brauch und was nicht ist mitunter nicht so ganz klar. Da man mir die Kristallkugel geklaut hat, mit der ich nocrmalerweise Gedanken lese.. Dumm gelaufen 

Egal, um bei einem Lförmigen Polygon einen Punkt innerhalb zu finden müsste man das Polygon zuerst triangulieren. Da übliche Triangulierer ohne zutun nur konvexe Körper triangulieren erzeugen die hierbei auch Dreiecke die nicht im Polygon liegen. Das bedeutet man muss nun noch die rausfiltern die im Polygon liegen und den Rest verwerfen.

Lass dir gesagt sein, das ist alles andere als trivial - insbesondere wenn man es hundsstabil braucht. Es gibt jede Menge Beispiele die vorgeben Punkte in Polygonen auszumachen. Funktionieren tun nur eine Hand voll - mit Nachhilfe.

Wer beim Thema Triangulieren etwas neugierig geworden ist.

http://www.flanguasco.org/VisualBasic/VisualBasic.html

Nicht abschrecken lassen, Franco ist Italiener der code ist aber gut lesbar.

Und Routinen (unter anderem ) für Punkte in Polygonen gibt es bei Paul Bourke

http://paulbourke.net/

Wie gesagt alles nicht trivial oder Anfänger geeignet. In 90% der Fälle dürfte man mit einem Flächenschwerpunkt glücklich werden. Und beim Rest hilft man halt etwas nach. So mach ich das zumindest.

Der Zeit und Rechenaufwand den man betreiben müsste das vollautomatisch hinzubekommen steht in keinem gescheiten Verhältnis.

Aber vielleicht hat ja jemand nen anderen Algorithmus oder ne Idee wie man das hinbekommen könnte. Hm Vielleicht längste Seite des Polygons finden und dann versuchen die gegenüberliegende Linie zu finden und dazwischen im Mittelpunkt...

Zum Thema Schwerpunkte etc.
Man könnte auch auf den Trichter kommen Regionen zu erschaffen und diese In Solids umwandeln. Dann müsste man eigentlich die nativen Autocad Abfrageroutinen aufrufen können. Das habe ich jedoch nie implementiert. (ist eklig :d ) Damit ließen sich dann auch runde Formen oder Löcher verarbeiten. Da ichs noch nie gebraucht hab, hab ichs auch noch nicht implementiert.

Lieben Gruß
Thomas

------------------
Wer es nicht versucht, hat schon verlorn 
Und bei 3 Typos gibts den vierten gratis !
<<< for sale !

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: 2624
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 16. Apr. 2018 11:48    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 Andre B. 10 Unities + Antwort hilfreich

Hallo Thomas,
Deine Ausführungen sind ja sehr interessant aber hier geht es nicht um Mechanik sondern, wenn man es genau nimmt, um ein Spezialgebiet der Mathematik, der Topologie. Eigentlich sucht André den mittigen Innenpunkt, so wie dieser von Acad Map bei Flächentopologien eingetragen werden kann. Aber nachdem ich im Bedarfsfall dieses Programm oder ArcGis verwende habe ich für die Programmierung dazu auch noch keine Zeit geopfert.

Grüße
Klaus 

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

rexxitall
Mitglied
Dipl. -Ing. Bau


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

Beiträge: 266
Registriert: 07.06.2013

Various: systems, Operating systems, cad systems, cad versions, programming languages.

erstellt am: 19. Apr. 2018 13:57    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 Andre B. 10 Unities + Antwort hilfreich

Hi - na wenn da mal wer nen Algorithmus auftreiben würde täts mich ja auch durchaus interessieren. Auf das Hexenwerk bin ich echt gespannt. Für Beschriftungen ja durchaus hilfreich. Nur ich hege nach wie vor den dumpfen Verdacht, das das alles andre als trivial sein dürfte. Falls wer also eine Quelle auftreibt nur her damit. Egal ob VBA oder welche Programmiersprache auch immer. .oO(Hab mir ja neulich von Telerink das komplette Konverterpaket gegönnt) (echt Klasse, wenn auch nicht gerade für lau)  Lieben Gruß Thomas

------------------
Wer es nicht versucht, hat schon verlorn 
Und bei 3 Typos gibts den vierten gratis !
<<< for sale !

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