| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Schraffur in Jig (2032 mal gelesen)
|
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 12. Mai. 2011 15:27 <-- editieren / zitieren --> Unities abgeben:         
Hallo an Alle, ich möchte in einem JIg eine Schraffur darstellen. Dazu erzeuge ich eine Polylinie und diese verwende ich dann um die Umrisse der Schraffur zu erstellen. Protected Overrides Function WorldDraw(ByVal draw As Autodesk.AutoCAD.GraphicsInterface.WorldDraw) As Boolean Dim i As Integer Dim mybulge As DoubleCollection = New DoubleCollection Dim pointstemp As Point3dCollection = New Point3dCollection For i = 1 To points.Count pointstemp.Add(points(i - 1)) mybulge.Add(0) Next mybulge.Add(0) pointstemp.Add(BasePt) Poly = New Polyline2d(Poly2dType.SimplePoly, pointstemp, 0.0, True, 0.0, 0.0, mybulge) draw.Geometry.Draw(Poly) Dim myhatch As Hatch = New Hatch Dim ObiD As ObjectIdCollection = New ObjectIdCollection ObiD.Add(Poly.ObjectId) myhatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID") myhatch.AppendLoop(HatchLoopTypes.Default, ObiD) End Function Das funktioniert bis zur letzten Zeile. Dort bricht ACAD ab und ich bekomme die Fehlermeldung: "eInvalidInput" Was mache ich da falsch? Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Mai. 2011 15:40 <-- editieren / zitieren -->
Hi, ich kann jetzt nicht gucken gehen, aber Du kannst es ja mal testen. IMHO kannst du nur Grenzen einer Schraffur zuweisen, die Bestandteil der Database sind. Probier mal in einem kleinen Testprojekt eine Polylinie zu erstellen, diese nicht dem Modellbereich (und auch keiner Transaction) hinzuzufügen. Würde mich nicht wundern, wenn da der gleiche Fehler kommen würde. - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 13. Mai. 2011 07:51 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, die Polylinie ist für mich nur Mittel zum Zweck. Die brauch ich nicht unbedingt. Hast Du nen Lösungsansatz wie ich von der Punkteliste zu der Schraffur komme? Wie würdest Du da vorgehen? Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 13. Mai. 2011 08:36 <-- editieren / zitieren -->
Hi, wenn Du nur 3 oder 4 Punkte hast, dann würd ich es nicht mit Schraffur, sondern mit 2D-SOLID machen. Und muss es eine Schraffur sein, dann könntest Du eine Dummy-Polylinie vor Start im JIG-Modus erzeugen (Modellbereich und Transaction hinzufügen), diese Polylinie dann im Zuge von JIG modifizieren (um darauf die Schraffur aufzubauen) und am Ende (nach JIG-Functions) die Poly wieder vertschüssen. Hast Du eigentlich probiert, ob ich überhaupt recht hab? Hast Du eine TestSub gemacht mit Schraffurerzeugung aus Poly (ohne die Poly dem Modellbereich und einer TransAction hinzuzufügen)? - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 13. Mai. 2011 11:57 <-- editieren / zitieren --> Unities abgeben:         
Hi Alfred, dein erster Vorschlag funktioniert. Das wende ich schon ein parrmal an. Aber jetzt möchte ich Solids mit mehr Punkten erstellen und da bräuchte ich die Schraffur dazu. Ich habe schon einiges rumprobiert, habe es aber nicht geschafft "managed" eine Schraffur zu erstellen. Das liegt aber an meinen mangelnden Kenntnissen. ich müsste also vor dem Jigaufruf eine Polylinie erstellen. Diese dem aktuellen Layout zuweissen. diese dann dem Jig übergeben. Dort würde ich dann der Polylinie die Punkte zuweissen und dann dmit die Schraffur erstellen. nach dem Jig müsste ich die Polylinie wieder löschen. Probier ich mal aus. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Mai. 2011 14:26 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, ich bin grad dabei die Polylinie den aktuellen Layout zu zu ordnen. das Beispiel das ich gefunden habe fügt die Polylinie in den Modelbereich ein. kannst Du mir nen Tip geben wie ich an das aktuelle Layout kommen? Dim Poly As Polyline2d Poly = New Polyline2d(Poly2dType.SimplePoly, pointstemp, 0.0, True, 0.0, 0.0, mybulge) Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim acBlkTbl As BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) Dim acBlkTblRec As BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite) acBlkTblRec.AppendEntity(Poly) End Using
Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 18. Mai. 2011 14:51 <-- editieren / zitieren -->
Hi, in dieser Zeile:
Code: acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
bestimmst Du, dass der Modellbereich zum Speichern verwendet wird. Du musst statt der BlockTableRecordID des Modellbereichs die BlockTableRecordID Deines Layouts herausfinden und im obigen Statement verwenden. Kleine Vorsichtshinweise dazu: Nachdem es mehrere Layouts gibt, gibt es nicht EINE ID für Layoutblock, sondern jedes Layout hat seinen Block. Über Layoutmanager und Layoutname kommst Du dort hin. HTH, - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Mai. 2011 15:45 <-- editieren / zitieren --> Unities abgeben:         
Hi Alfred, noch ein Problemchen ist aufgetreten. Nach dem ich die neuen Punkte der Polylinie hinzugefügt habe und diese benutzt habe um die Schraffur zu erstellen, bräuchte ich die Polylinie wieder in ihrer vorherigen Art, also nicht geschloßen und ohne die zusätzlichen Punkte. Protected Overrides Function WorldDraw(ByVal draw As Autodesk.AutoCAD.GraphicsInterface.WorldDraw) As Boolean Dim Punkt As Point3d points.Add(BasePt) For Each Punkt In points Dim mvertex As Vertex2d = New Vertex2d(Punkt, 0, 0, 0, 0) Poly.AppendVertex(mvertex) Next Dim myhatch As Hatch = New Hatch Dim ObiD As ObjectIdCollection = New ObjectIdCollection Poly.Closed = True ObiD.Add(Poly.ObjectId) myhatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID") draw.Geometry.Draw(Poly) myhatch.AppendLoop(HatchLoopTypes.Default, ObiD) ----hier müsste die Polylinie wieder zurück gestzt werden--- End Function
wie krieg ich das hin? kann ich closed wieder einfach auf "false setzen? Wie kann ich die zuletzt eingefügten Punkte löschen? Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 18. Mai. 2011 16:24 <-- editieren / zitieren -->
Hi, wieso arbeitest Du denn mit der alten Poly? Bei der LWPoly gibts ein .removeVertexAt Die alte Version hab ich nicht im Kopf, nur soweit, die Kopfstände mit dem alten Polylinientyp sind mit rotem Kopf verbunden. Wenn ich mich recht erinnere, dann musst Du das Vertex_Datenbankobjekt zuerst mal zum Schreiben öffnen und dann löschen. - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 18. Mai. 2011 16:56 <-- editieren / zitieren --> Unities abgeben:         
Hi Alfred, ich hab mit der alten Poly2d gearbeitet,weil ich ein altes beispiel kopiert habe. Jetzt habe ich auf nur "Polylinie" umgestellt. Es klappt jetzt bis auf die Schraffur, wenn ich die erstellen möchte, dann bricht ACAD ab und ich krieg die Fehlermeldung "eInvalidInput". Mein Jig sieht inzwischen so aus: Protected Overrides Function WorldDraw(ByVal draw As Autodesk.AutoCAD.GraphicsInterface.WorldDraw) As Boolean Poly.AddVertexAt(0, New Point2d(BasePt.X, BasePt.Y), 0, 0, 0) Dim myhatch As Hatch = New Hatch Dim ObiD As ObjectIdCollection = New ObjectIdCollection Poly.Closed = True ObiD.Add(Poly.ObjectId) myhatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID") draw.Geometry.Draw(Poly) myhatch.AppendLoop(HatchLoopTypes.Polyline, ObiD) Poly.Closed = False Poly.RemoveVertexAt(0) End Function Was mach ich jetzt noch falsch? Muß ich die Poly irgendwie regenerieren, bevor ich sie verwenden kann? Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 18. Mai. 2011 17:41 <-- editieren / zitieren -->
Hi, eine Poly mit einem einzigen Vertex ist keine gültige Schraffurgrenze. Polylinien müssen imho zumindest 2 Vertizes haben, und damit sie als Grenze für eine schraffierbare Fläche herhalten können ==> zumindest 3 Vertizes plus 'geschlossen' sein. - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 18. Mai. 2011 23:32 <-- editieren / zitieren -->
Hi, nun denn, hier ein Beispiel, das: a) JIG mit Schraffur zeigt b) JIG in Modellbereich und Layout (was halt gerade aktuell ist) zeigt. Viel Erfolg damit, - alfred - ------------------ www.hollaus.at |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 19. Mai. 2011 10:22 <-- editieren / zitieren --> Unities abgeben:         
Danke für die Beispiele. Die schau ich mir heut nachmittag an. leider kann ich sie mit VB Express 2008 nicht öffnen. Du hast sie vielleicht mit 2010 erstellt. Ist aber egal, ich kann sie ja im Editor öffnen und dann die Texte kopieren. Sieht wie immer sehr proffesionell aus. Werd versuchen zu verstehnen was da abläuft und das dann in meine Jig zu übernehmen. Danke und Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
 
 Beiträge: 426 Registriert: 08.10.2008 ACAD 2024 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 20. Mai. 2011 12:32 <-- editieren / zitieren --> Unities abgeben:         
Hi Alfred, funktioniert super. Nur bei schneller Mausbewegung(hin und her) bleibt ACAD hängen. Kann ich die Darstellung ein bischen träger machen. Damit es stabiler läuft. Ich dachte es ginge hier: If pLastPnt.DistanceTo(tPnt) > 0.1 Then hat aber keine Auswirkung. Hast Du noch eine Idee wie mann es etwas ruhiger machen kann. Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
Ex-Mitglied
|
erstellt am: 20. Mai. 2011 12:41 <-- editieren / zitieren -->
Hi, >> Nur bei schneller Mausbewegung(hin und her) bleibt ACAD hängen Sag Deinen Leuten halt, die sollen nicht so hektisch herumtun, heut ist Freitag und die Maus ist müde. Spass beiseite:
Zum einen gibt's noch den Event des PointMonitors, da kann man eingreifen (geht tief, ... sehr tief, dafür wär's ganz sauber). Alternative (die leichtere Variante) wäre: Du speicherst Dir in einer Variable die Zeit des letzten Updates und wird dieses aufgerufen, wenn noch keine 5ms vergangen sind, dann überspringst Du das Update-Zeichnen. VORSICHT DABEI: dass Dir nicht die letzte Position dabei entgeht. Als dritte Variante würde mir noch einfallen, mal mit DoEvents während der Update-Sub den anderen Events eine Chance zu geben ==> das hab ich aber nicht probiert, könnte Brösel geben. - alfred - ------------------ www.hollaus.at |