Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Einfache polylinie erstellen

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:  Einfache polylinie erstellen (1999 mal gelesen)
Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 21. Jan. 2011 14:11    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 steh grad so was von auf dem Schlauch. Hab mich schon im Netz wundgesucht.
Ich suche den Code für das einfache Einfügen einer Polyline. So wie mit dem Autocad CommandBefehl "PL". Wo nacheinander die Punkte im Modellbereich abgefagt werden. Codebeispiele mit festgelegten Punkten gibts genug. Kann mir jemand helfen?
Danke!

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

ivb.hst
Mitglied
Programmierer


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

Beiträge: 15
Registriert: 11.10.2010

AutoCAD 2007-2013 32/64bit
Windows 7 Ultimate 64Bit
Inter(R) Core(TM) i5-2500K 3.3 GHz

erstellt am: 21. Jan. 2011 16:34    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 Boehri 10 Unities + Antwort hilfreich

Im folgenden habe ich mal ein Beispiel aus einem größeren Programmcode herauskopiert.


AcDbPolyline *poly = NULL;
while (true)
{
  AcGePoint3d result, pt;
  AcDbObjectId id;
  int ptCount = 0;
  int iRetVal = acedGetPoint(NULL,L"\r\nStartpunkt eingeben: ", pt);
  if (iRetVal == RTCAN) return Acad::eUserCanceled;
  ptCount = 1;
  while (iRetVal == RTNORM)
  {
      if (ptCount == 1)
        iRetVal = acedGetPoint(&pt,L"\r\nNächster Umringspunkt:",result);
      else if (ptCount == 2)
      {
        acedInitGet(128,L"Zurück");
        iRetVal = acedGetPoint(&pt,L"\r\nNächster Umringspunkt oder [Zurück]:",result);
      }
      else
      {
        acedInitGet(128,L"Schliessen Zurück");
        iRetVal = acedGetPoint(&pt,L"\r\nNächster Umringspunkt oder [Schließen/Zurück]:",result);
      }
      if (iRetVal == RTCAN | | iRetVal == RTNONE)
        break;
      else if (iRetVal == RTNORM)
      {
        if (ptCount == 1 && poly == NULL)
        {
            poly = new AcDbPolyline();
            addToCurrentSpace(poly);
            poly->addVertexAt(0,AcGePoint2d(pt.x, pt.y));
            poly->addVertexAt(1,AcGePoint2d(result.x, result.y));
            id = poly->objectId();
            poly->close();
        }
        else if (poly)
        {
            if (acdbOpenObject(poly,id,AcDb::kForWrite) == Acad::eOk)
            {
              poly->addVertexAt(poly->numVerts(), AcGePoint2d(result.x, result.y));
              poly->close();
            }
          }
          pt = result;
          ptCount++;
      }
      else if (iRetVal == RTKWORD)
      {
        AcString str;
        acedGetInput(str);
        if (acedCompare(str, L"Zurück")==0)
        {
            if (acdbOpenObject(poly,id,AcDb::kForWrite) == Acad::eOk)
            {
              poly->removeVertexAt(ptCount-1);
              poly->close();
            }
            ptCount --;
            iRetVal = RTNORM;
            if (acdbOpenObject(poly,id,AcDb::kForRead) == Acad::eOk)
            {
              poly->getEndPoint(pt);
              poly->close();
            }
        }
        else if (acedCompare(str, L"Schliessen")==0)
        {
            if (acdbOpenObject(poly,id,AcDb::kForWrite) == Acad::eOk)
            {
                poly->setClosed(Adesk::kTrue);
                poly->close();
            }
            break;
        }
      }
  }
}

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

Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 24. Jan. 2011 10:30    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

Vielen Dank ivb.hst,

übers Wochenende habe ich mir nochnal gedanken gemacht und will das nun so realisieren.

Code:

<LispFunction("PL")> _
Public Sub Polyline(ByVal rbArgs As ResultBuffer)
'' Get the current database and start the Transaction Manager
' Variablen im Header auswerten
Dim strLayer As String
Dim strLayerpräfix As String = My.Settings.strLinienpräfix & "-"
Dim strGewerk As String = My.Settings.strGewerk & "-"
Dim strMedium As String
If Not rbArgs = Nothing Then
Dim nCnt As Integer = 0
For Each rb As TypedValue In rbArgs
If (rb.TypeCode = Autodesk.AutoCAD.Runtime.LispDataType.Text) Then
                    Select Case nCnt
                        Case 0
                            strLayer = strLayerpräfix & strGewerk & rb.Value.ToString()
                            'Case 1
                            '    strLayersuffix = rb.Value.ToString()
                    End Select

                    nCnt = nCnt + 1
                End If
                strMedium = rb.Value.ToString()
            Next

        End If
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
acDoc.SendStringToExecute("._PLINIE ", False, False, False)



End Sub

Nun will ich über

Code:

Dim lastRes As PromptSelectionResult = acDoc.Editor.SelectLast()
If lastRes.Value IsNot Nothing AndAlso lastRes.Value.Count = 1 Then
  Using actrans As Transaction = acCurDb.TransactionManager.StartTransactionDim ent As Entity = CType(actrans.GetObject(lastRes.Value(0).ObjectId, OpenMode.ForRead), Entity) acDoc.Editor.WriteMessage(vbLf & "Layer: " + ent.Layer)
End Using
End If

den letzten Punkt der Linie abfragen.
Das müsste aber erst nach Beendigung des PLINE Befehls erfolgen.
Ich denke da an einen AddHandler.
Wie könnte ich diesen einbinden. Mir fehlt da noch ein wenig an Erfahrung  .

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


Ex-Mitglied

erstellt am: 24. Jan. 2011 10:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Du kannst Dir den Handler 'CommandEnded' oder 'EnteringQuiescentState' (jeweils aus dem Editor) in Deiner ersten Funktion setzen, dann in der zweiten Funktion prüfen, ob der Anwender nicht abgebrochen hat (also wirklich eine Poly erstellt hat) sowie den Handler wieder rücksetzen.
Welcher der Events für Deine App besser geeignet ist, hängt von Rest Deiner App ab. 

Nur gleich als Vorsichtsmaßnahme (ich hab's nicht probiert): Wenn Du in einer LISP-Funktion eine dotNET-App aufrufst und in dieser wiederum SendStringToExecute aufrufst, dann meine ich mal, Du könntest Überraschungen erleben. Belass es bei der Layerschaltung und starte dann in Deinem Lisp das Command für "_PLINE".

- alfred -

------------------
www.hollaus.at

Boehri
Mitglied



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

Beiträge: 80
Registriert: 07.04.2008

erstellt am: 25. Jan. 2011 07:12    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 Alfred,

vielen Dank für die Antwort.
Bis jetz hat alles gut funktioniert und es gibt keine Probleme 
Bis zum nächsten mal.

Gruß Boehri

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