| | | 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
Beiträge: 80 Registriert: 07.04.2008
|
erstellt am: 21. Jan. 2011 14:11 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für Boehri
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
Beiträge: 80 Registriert: 07.04.2008
|
erstellt am: 24. Jan. 2011 10:30 <-- editieren / zitieren --> Unities abgeben:
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 SubNun 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 / zitieren -->
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
Beiträge: 80 Registriert: 07.04.2008
|
erstellt am: 25. Jan. 2011 07:12 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|