| |
 | 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: Linie auf Polylinie trimmen (2130 mal gelesen)
|
bccad Mitglied

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 01. Dez. 2009 19:34 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich bin gerade dabei ein Tool zu programmieren welches aus Koordinatenlisten und anderen Daten relativ selbstständig diverse Zeichnungen erstellt. Das klappt soweit auch ganz gut. Was mir noch fehlt habe ich in dem Anhang mal etwas schlicht skizziert. Ich muss die Linie-1 nach beiden Seiten auf die Polylinie-2 trimmen und dann die Fläche unter der Linie mit Solid füllen. Ein Kinderspiel wenn man es "von vorne" macht. Aber wie macht man es mit VBA ?? Handle der beiden Elemente hab ich gespeichert. Habt ihr eine Idee ???
[Diese Nachricht wurde von bccad am 01. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 01. Dez. 2009 20:18 <-- editieren / zitieren -->
Hi, wenn die Voraussetzungen immer die sind, dass die Linie-1 schon besteht und gesichtert auf beiden Seiten (je) einen Schnittpunkt mit Polylinie-2 hat, dann: - Schnittpunkte zwischen Polyline und Linie ermitteln (mit der Option Extend) - durch die Segmente der Polylinie durchbasteln bis man zum ersten Segment kommt, auf dem einer der beiden Schnittpunkte liegt - dieser Schnittpunkt ist der Startpunkt einer neuen temporären Polylinie - an der bestehenden Polylinie-2 weiter durch die Vertizes hüpfen und jeden dieser Vertizes der temp. Polylinie hinzufügen - BIS man zu einem Segment auf Polylinie-2 kommt, wo der zweite Schnittpunkt (von ganz oben) gefunden wird - den zweiten Schnittpunkt der temp. Polylinie hinzufügen - die temp. Polylinie schliessen - eine Schraffur erstellen auf Basis der temp. Polylinie Eine von vielen Varianten, HTH, - alfred - ------------------ www.hollaus.at |
bccad Mitglied

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 02. Dez. 2009 09:10 <-- editieren / zitieren --> Unities abgeben:         
Hallo a.n., das hilft mir leider nicht weiter. Wenn ich die Zeichnung von Hand erstelle nehme ich den Befehl Dehnen, klicke die Polylinie an, die Linie einmal rechts, einmal links und fertig ist es. Das möchte ich automatisieren. Wie ruft man die Befehle von VBA aus auf ? Mit SendCommand, aber was ? Möglicherweise auch eine Frage an die LISP-Kundigen in diesem Forum.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 02. Dez. 2009 09:17 <-- editieren / zitieren --> Unities abgeben:          Nur für bccad
Alfred meint, du sollst dir mal die Methode IntersectWith der Linie ansehen , der du als Parameter das Polylinienobjekte und acExtendThisEntity mitgibst .... die Rückgabe sollten dann die Schnittpunkte sein, deren Koordinaten du der Linie als Start und Endpoint übergibst... zu den Sachen gibts auch Beispiele in der Entwicklerdoku... Sub Example_IntersectWith() ' This example creates a line and circle and finds the points at ' which they intersect. ' Create the line Dim lineObj As AcadLine Dim startPt(0 To 2) As Double Dim endPt(0 To 2) As Double startPt(0) = 1: startPt(1) = 1: startPt(2) = 0 endPt(0) = 5: endPt(1) = 5: endPt(2) = 0 Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt) ' Create the circle Dim circleObj As AcadCircle Dim centerPt(0 To 2) As Double Dim radius As Double centerPt(0) = 3: centerPt(1) = 3: centerPt(2) = 0 radius = 1 Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPt, radius) ZoomAll ' Find the intersection points between the line and the circle Dim intPoints As Variant intPoints = lineObj.IntersectWith(circleObj, acExtendNone) ' Print all the intersection points Dim I As Integer, j As Integer, k As Integer Dim str As String If VarType(intPoints) <> vbEmpty Then For I = LBound(intPoints) To UBound(intPoints) str = "Intersection Point[" & k & "] is: " & intPoints(j) & "," & intPoints(j + 1) & "," & intPoints(j + 2) MsgBox str, , "IntersectWith Example" str = "" I = I + 2 j = j + 3 k = k + 1 Next End If End Sub ------------------ - 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 |
Ex-Mitglied
|
erstellt am: 02. Dez. 2009 09:22 <-- editieren / zitieren -->
Hi, Code: Dim tPLine As AcadLWPolyline Dim tLine As AcadLine '...tPLine und tLine sollten durch Einleseroutine ja schon bekannt sein Dim tIntPnts As Variant tIntPnts = tLine.IntersectWith(tPLine, acExtendThisEntity) 'und hier stehen dann die Schnittpunkte drin
>> Wie ruft man die Befehle von VBA aus auf ? Mit SendCommand, aber was ? SendCommand ist hier absolut fehl am Platz, da Du Klicks am Bildschirm durchführen musst (um die Seite der Dehnung zu bestimmen), sollten dann aber mehrere Elemene übereinander sein, hast Du mit SendCommand keine Chance, Feedback zu bekommen, welches der Elemente jetzt selektiert wurde. >> Möglicherweise auch eine Frage an die LISP-Kundigen in diesem Forum Du kannst es mit beidem, mit Lisp und mit VBA, wenn Du aber Fragen im VBA-Forum stellst, dann werden wir davon ausgehen, dass Du Deine Tätigkeiten auch mit VBA lösen willst. - alfred - ------------------ www.hollaus.at |
bccad Mitglied

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 02. Dez. 2009 19:32 <-- editieren / zitieren --> Unities abgeben:         
Hallo a.n. & CADmium, das scheint zumindest mein Linienproblem zu lösen. Vielen Dank. Gibt es für die Flächenfüllung nicht auch einen einfacheren Weg ? Die Zeichnung entsteht auf einem leeren Blatt, doppelte Elemente gibt es nicht. Kann man nicht ein Klick unterhalb der Linie simulieren und ACAD den Umring alleine finden lassen ? Zitat:
Du kannst es mit beidem, mit Lisp und mit VBA, wenn Du aber Fragen im VBA-Forum stellst, dann werden wir davon ausgehen, dass Du Deine Tätigkeiten auch mit VBA lösen willst.
Schon richtig, aber bei meinem letzten Problem war am Ende auch ein Lisp-Befehl über SendCommand der Weisheit letzter Schluss. Mir ist die Lösung wichtiger als die reine Lehre. - bccad -
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 02. Dez. 2009 19:45 <-- editieren / zitieren -->
Hi, >> und ACAD den Umring alleine finden lassen ? 0.1 Cent für jede Meldung von AutoCAD, dass die Grenze nicht gefunden werden konnte (Überweisung natürlich an mich) und ich würde dies hier von der Karibik beantworten können. Und genau aus diesem Grunde, dass eigentlich nachfolgendes durchgehend unsicher ist, ist es auch von meiner Seite nicht zu empfehlen. Wenn Du VBA nur des SendCommands wegen nutzt, kannst Du aber auch gleich ein Script machen, wo die Befehle untereinander stehen, das wäre dann die minimalistische Methode. - alfred - ------------------ www.hollaus.at |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten

 Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - ACA 2013 Arcibem System: Windows NT, 2000, XP Internet-Startseite: http://www.archi.de
|
erstellt am: 02. Dez. 2009 19:57 <-- editieren / zitieren --> Unities abgeben:          Nur für bccad
Hallo, nur mal so ein kleiner Hinweis: Wenn es sich bei der Form IMMER um ein Viereck handelt, könntest Du statt komplizierter Schraffurgenerationen auch einfach die Fläche mit einem SOLID (nicht 3D!) füllen. Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bccad Mitglied

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 02. Dez. 2009 20:08 <-- editieren / zitieren --> Unities abgeben:         
Hi a.n., nein, nicht das wir uns falsch verstehen. Mein Programm ist ziemlich komplex. (ca. 2500 Codezeilen) (Zeichnet Gewässerprofile mit dynamischen Blattrahmen, Maßbändern und georeferenziert die Fotos) Da kommt man mit Scripten nicht hin. Aber gegen ein SendCommand hab ich absolut nichts einzuwenden, wenn es die einfachere Lösung ist. Wenn ich das mit der Wasserstanslinie und und der Flächenfüllung auch noch raffe dann braucht der Anwender nur noch auf Plotten zu drücken. - bccad - [Diese Nachricht wurde von bccad am 02. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 02. Dez. 2009 20:20 <-- editieren / zitieren -->
Hi, wenn es schon 2500 Programmzeilen gibt (und diese was mit AutoCAD tun?), dann hätte ich mal vermutet, dass mit meiner Beschreibung gearbeitet werden kann. Tut's offenbar nicht, also schlecht beschrieben Woran scheiterst es denn bei Dir? Welcher Punkt ist nicht klar? - alfred - ------------------ www.hollaus.at |
bccad Mitglied

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 02. Dez. 2009 20:30 <-- editieren / zitieren --> Unities abgeben:         
Hi a.n., es scheitert daran das ich kein richtiger Programmierer bin, mein Englisch zum lesen der Doku reicht gerade mal für die Überschriften und viel Zeit zum rumprobieren hab ich leider auch nicht. Deshalb kann ich (und das wird möglicherweise Vielen so gehen) mit CADmiums Tip und mit deinem 2. Beitrag mehr anfangen. Ein Codeschnipsel sagt mehr als tausend Worte. Ohne Foren wie dieses wäre ich aufgeschmissen. (Lese euch schon eine ganze Weile) - bccad - Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian Blei Mitglied
 
 Beiträge: 124 Registriert: 23.06.2008 Thinkpad T60p, 4GB XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,
|
erstellt am: 02. Dez. 2009 20:54 <-- editieren / zitieren --> Unities abgeben:          Nur für bccad
|
Ex-Mitglied
|
erstellt am: 02. Dez. 2009 20:58 <-- editieren / zitieren -->
Hi, mach mal ein Upload von 2 oder 3 solcher Zeichnungen (damit ich ev. damit kritische Situationen vorher erkenne). >> Ein Codeschnipsel sagt mehr als tausend Worte nix gegen Codeschnippsel hier einzuwenden, aber bisher hat die theoretische Beschreibung nicht geholfen, der Auszug der Hilfe (von Thomas) hat nicht geholfen, also sollte wer das ganze für Dich machen? - alfred - ------------------ www.hollaus.at |
bccad Mitglied

 Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 02. Dez. 2009 21:36 <-- editieren / zitieren --> Unities abgeben:         
Hi, also der Auszug aus der Hilfe war schon richtig. Ich wuste nicht das es diese IntersectWith-Methode gibt. Und deine 5 Zeilen Code haben den ersten Teil des Problems doch genau getroffen. Damit komme ich klar. Die Flächenfüllung werde ich am Ende wohl so machen müssen wie du es vorgeschlagen hast, aber ich hatte gehofft das es auch einfacher geht. - bccad - Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |