| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: JIG Objekt (1847 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: 26. Okt. 2010 16:24 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, ich möchte Blöcke in eine Zeichnung einfügen (mit VB2008 in ACAD2010). Dabei soll eine Voransicht des Blockes an der Maus kleben. Bisher löse ich das mit Sendcommand. Funktioniert, ist aber nicht so schön. Jetzt weiß ich inzwischen schon, daß das Jig-Objekt die Lösung meines Problems wäre. Nun meine Frage: Hat jemand ein kleines einfaches Beispiel für Das JIG-Objekt, damit ich mal nen schnellen Einstieg finden würde. Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Okt. 2010 16:33 <-- editieren / zitieren -->
Hi, wenn Du Dir das ObjectARX-Kit heruntergeladen hast, dann hast Du so ein Beispiel schon in: samples\dotNet\EllipseJig Wenn nicht, dann lade Dir das >>>ObjectARX-Kit<<< herunter (registrierungspflichtig, aber kostenlos). - alfred - ------------------ www.hollaus.at |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 20xx, Civil 3D 201x, Inventor Prof 201x usw.
|
erstellt am: 26. Okt. 2010 19:01 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
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: 27. Okt. 2010 10:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ich habe mir das Beispiel im Object-ARX Kit mal angesehen. Aber ich komme mit diesen Dateien "*.cs" nicht zurecht. Was ist das? Handelt es sich um C++? Kann ich das Beispiel trotzdem irgendwie verwenden, also nach VB übersetzen? Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 27. Okt. 2010 11:18 <-- editieren / zitieren -->
Hi, die Extension .cs steht für C# (C-Sharp) und ist das dotNET-basierte C. Es gibt zum einen im Internet einige Übersetzer-Homepages, die (mit hoher Trefferquote) die Übersetzung von C# auf VB durchführen, diese Codes sind wirklich fast 1:1 verwendbar. Einen Vortrag über JIG mit VB.NET hätte ich noch >>>hier<<< gefunden. - alfred - ------------------ www.hollaus.at |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 27. Okt. 2010 15:22 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
noch eine Ergänzung: Falls du dich damit beschäftigst, solltest du dir darüber bewusst sein, dass du mehrere JIG-Geschichten benötigst - eine für jede Eigenschaftsänderung 1) Einfügepunkt 2) Drehung 3) Skalierung Darüber war ich zuerst gestolpert. Ist aber, wenn man es einmal kapiert hat, recht einfach, das zu bauen. (Limnk zu einem Bsp gabs ja in einem der vorherigen Beiträge) Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! 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: 28. Okt. 2010 10:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, genau an dem Thema häng ich gerade. Ich möchte den Block gedreht und skaliert darstellen. Der Block sollte wenn er an der Maus hängt schon einen festen skalierfaktor und Drehung haben. Also nicht wie beim AutoCAD Einfügebefehl, wo diese Dinge nacheinander ablaufen. Wo kann ich die Größe und Drehung des dargestellten Blocks einstellen. Wie gesagt die beiden Größen sollen nicht von der Maus abhängen sondern fest eingestellt werden. Danke für jeden Tip oder Beispiele. Bitte bei Beispielen, das unötige weglassen. Mir fällt es manchmal schwer das Schöne von dem Notwendigen zu unterscheiden. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 28. Okt. 2010 10:57 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo Theo, du fügst doch eine Blockreferenz ein, bei dieser setzt du direkt nach dem Einfügen die Skalierung und Drehung auf die Werte, die du gern hättest. Genau das Selbe machst du natürlich in dem JIG-Object, damit auch am Mauszeiger die Skalierung bereits passt. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! 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: 28. Okt. 2010 14:15 <-- editieren / zitieren --> Unities abgeben:
Hallo und Danke an Alle die bisher geschrieben haben. Ich bin jetzt schon ziemlich weit gekommen. Aber jetzt habe ich noch ein Problem beidem ich nicht so recht weiter komme. Ich kann den Block jetzt drehen und auch skalieren. Schön wäre wenn ich ihn auch noch relativ zum Mauszeiger verschieben könnte. Also er sollte nicht direkt am Fadenkreuz hängen, sondern zum Beispiel 20 Einheiten darunter. Geht das? wenn ja wie? Sub New(ByVal BlockIns As Point3d, ByVal BlockID As ObjectId) MyBase.New(New DatabaseServices.BlockReference(BlockIns, BlockID)) myBRef = Me.Entity myBRef.Rotation = 1 -dreht mal ein bischen- myBRef.ScaleFactors = New Geometry.Scale3d(3, 1, 1) -skaliert mal ein bischen- End Sub Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Okt. 2010 15:04 <-- editieren / zitieren -->
Hi, wenn Du im Sampler den Punkt einfach um Y um -20 hinunterrechnest? - 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: 28. Okt. 2010 15:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ich hab meinen Sampler mal abgeändert wie unten: Protected Overrides Function Sampler(ByVal prompts As JigPrompts) _ As SamplerStatus Dim myPPR As PromptPointResult Dim newpoint As Point3d myPPR = prompts.AcquirePoint(myOpts) Dim curPos As Point3d curPos = myPPR.Value If curPos.IsEqualTo(BasePt) Then Return SamplerStatus.NoChange Else newpoint = New Geometry.Point3d(myPPR.Value.X + 100, myPPR.Value.Y - 20, myPPR.Value.Z) -diese Zeile ist neu-- myMatrix = Geometry.Matrix3d.Displacement( _ BasePt.GetVectorTo(newpoint)) BasePt = myPPR.Value Return SamplerStatus.OK End If End Function
Es ändert sich an der Anzeige leider gar nichts. Welchen Punkt(in welcher Zeile) muß ich ändern? Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Okt. 2010 16:00 <-- editieren / zitieren -->
Hi, kannst Du die ganze Solution zur Verfügung stellen, das rundherum ist nicht gerade gut vorstellbar mit diesem Code-Schnippsel. - 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: 28. Okt. 2010 16:20 <-- editieren / zitieren --> Unities abgeben:
Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Geometry Imports Autodesk.AutoCAD Public Class AU_BlockJig Inherits Autodesk.AutoCAD.EditorInput.EntityJig Dim BasePt As Point3d = New Point3d(0, 0, 0) Dim myMatrix As Matrix3d Dim myBRef As DatabaseServices.BlockReference Dim myOpts As EditorInput.JigPromptPointOptions Sub New(ByVal BlockIns As Point3d, ByVal BlockID As ObjectId) MyBase.New(New DatabaseServices.BlockReference(BlockIns, BlockID)) myBRef = Me.Entity myBRef.Rotation = 1 myBRef.ScaleFactors = New Geometry.Scale3d(3, 1, 1) End Sub Function BeginJig() As PromptPointResult If myOpts Is Nothing Then myOpts = New EditorInput.JigPromptPointOptions() myOpts.Message = vbCrLf & "Select a point:" myOpts.Cursor = EditorInput.CursorType.Crosshair myOpts.UseBasePoint = False End If Dim ed As EditorInput.Editor = _ Application.DocumentManager.MdiActiveDocument.Editor Dim myPR As PromptResult myPR = ed.Drag(Me) Do Select Case myPR.Status Case EditorInput.PromptStatus.OK Return myPR Exit Do Case EditorInput.PromptStatus.None Return myPR Exit Do Case EditorInput.PromptStatus.Other Return myPR Exit Do End Select Loop While myPR.Status <> EditorInput.PromptStatus.Cancel Return Nothing End Function Protected Overrides Function Sampler(ByVal prompts As JigPrompts) _ As SamplerStatus Dim myPPR As PromptPointResult Dim newpoint As Point3d myPPR = prompts.AcquirePoint(myOpts) Dim curPos As Point3d curPos = myPPR.Value If curPos.IsEqualTo(BasePt) Then Return SamplerStatus.NoChange Else newpoint = New Geometry.Point3d(myPPR.Value.X + 100, myPPR.Value.Y - 20, myPPR.Value.Z) myMatrix = Geometry.Matrix3d.Displacement( _ BasePt.GetVectorTo(newpoint)) BasePt = myPPR.Value Return SamplerStatus.OK End If End Function Protected Overrides Function Update() As Boolean myBRef.Position = BasePt Return False End Function End Class Hi Alfred, das ist die ganze Klasse. Das ist natürlich Alles nur geklaut(kopiert) von Jerry Winters, (AutoDesk) Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Okt. 2010 22:29 <-- editieren / zitieren -->
Hi, ich glaube, da ist was beim Abkupfern passiert. Mal meine Variante aus Deinem Code, gesplittet in zwei Teile: a) die Initialisierung, die eine Blockreference erzeugt, dieses der JIG-Instanz übergibt und dann im Modellbereich einfügt b) die JIG-Klasse (ja, so klein kann sie sein ) HTH, - alfred - PS: Auf Fehlerprüfungen, auf Blockdefinitions-Existenz wurde hier aus Gründen der Übersichtlichkeit verzichtet Code: Public Shared Sub CADde_Start(ByRef AcadDoc As ApplicationServices.Document) Dim tBlockName As String = "MeinBlock" 'hier bitte Dein Blockname Dim tDocLock As ApplicationServices.DocumentLock = AcadDoc.LockDocument Dim tTrAct As DatabaseServices.Transaction = AcadDoc.TransactionManager.StartTransaction Try Dim tPickedPnt() As Double = New Double() {0, 0, 0} Dim tBlTb As DatabaseServices.BlockTable = CType(tTrAct.GetObject(AcadDoc.Database.BlockTableId, DatabaseServices.OpenMode.ForRead, False), DatabaseServices.BlockTable) Dim tModSp As DatabaseServices.BlockTableRecord = CType(tTrAct.GetObject(tBlTb("*MODEL_SPACE"), DatabaseServices.OpenMode.ForWrite, False), DatabaseServices.BlockTableRecord) Dim tBlDef As DatabaseServices.BlockTableRecord = CType(tTrAct.GetObject(tBlTb(tBlockName), DatabaseServices.OpenMode.ForWrite, False), DatabaseServices.BlockTableRecord) 'hier erzeugen wir uns mal eine BlockReference und bestimmen Drehung und Skalierung Dim tBlRef As DatabaseServices.BlockReference = New DatabaseServices.BlockReference(Geometry.Point3d.Origin, tBlDef.ObjectId) tBlRef.Rotation = 1 tBlRef.ScaleFactors = New Geometry.Scale3d(3, 1, 1) 'jetzt erzeugen wir daraus eine JIG-Instanz, der wir dann die Kontrolle übergeben (an die Maus) Dim tJig As CADde_BlockJig = New CADde_BlockJig(Geometry.Point3d.Origin, tBlRef) Dim tPntRes As EditorInput.PromptPointResult = CType(AcadDoc.Editor.Drag(tJig), EditorInput.PromptPointResult) If tPntRes.Status = PromptStatus.OK Then 'und ist nicht abgebrochen worden, dann setzen wir den Block jetzt in den Modellbereich tBlRef.Position = tJig.getTransformedInsPnt(tPntRes.Value) tModSp.AppendEntity(tBlRef) tTrAct.AddNewlyCreatedDBObject(tBlRef, True) tTrAct.Commit() Else 'ist JIG abgebrochen worden, dann entledigen wir uns hier der Überreste tBlRef.Dispose() End If Catch ex As Exception 'TODO Fehlermeldung Finally If tTrAct IsNot Nothing Then tTrAct.Dispose() : tTrAct = Nothing If tDocLock IsNot Nothing Then tDocLock.Dispose() : tDocLock = Nothing End Try End Sub Public Class CADde_BlockJig Inherits Autodesk.AutoCAD.EditorInput.EntityJig Dim BasePt As Point3d = New Point3d(0, 0, 0)
Sub New(ByVal BlockRef As DatabaseServices.BlockReference) MyBase.New(BlockRef) End Sub Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus Dim myPPR As PromptPointResult = prompts.AcquirePoint("Punkt zeigen: ") Dim curPos As Point3d = myPPR.Value If curPos.IsEqualTo(BasePt) Then 'hier würde sich anbieten, eine Toleranz einzubauen, sonst könnte es flimmern Return SamplerStatus.NoChange Else BasePt = curPos Return SamplerStatus.OK End If End Function Protected Overrides Function Update() As Boolean CType(MyBase.Entity, DatabaseServices.BlockReference).Position = getTransformedInsPnt(BasePt) End Function Public Function getTransformedInsPnt(ByVal BasePt As Geometry.Point3d) As Geometry.Point3d 'hier ermitteln wir den Blockeinfügepunkt, abgeleitet aus Mausposition und Versatz in Y-Richtung Return New Geometry.Point3d(BasePt.X, BasePt.Y - 20, BasePt.Z) End Function End Class
------------------ 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: 29. Okt. 2010 12:21 <-- editieren / zitieren --> Unities abgeben:
|
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: 15. Nov. 2010 16:05 <-- editieren / zitieren --> Unities abgeben:
Ein Problemchen habe ich noch gefunden. Wofür es aber bestimmt eine einfache Lösung gibt. Mir ist aufgefallen, daß in einer Zeichnung in der der Layer Null ausgeschalten ist, die Jig-Linien nicht dargestellt werden. Kann es sein daß diese Jig-Objekte grundsätzlich auf Layer Null dargestellt werden? jetzt könnte ich den Layer Null einfach einschalten, will ich aber nicht unbedingt. Könnte ich meine Jig-Linien nicht auch irgendwie auf den aktuellen Layer darstellen? Danke für jeden Tipp. Unten ein bischen Code, wie ich die Linien erzeuge. Gruß, Theo Protected Overrides Function WorldDraw(ByVal draw As Autodesk.AutoCAD.GraphicsInterface.WorldDraw) As Boolean Dim LinksUnten As Point3d Dim LinksOben As Point3d Dim RechtsOben As Point3d Dim Länge As Double Dim Pot As Integer Dim Erg As Double If ThisDrawing.GetVariable("orthomode") = 0 Then For Pot = -4 To 4 Erg = 10 ^ Pot If Dist > Erg Then Länge = Erg If Dist > Erg * 2 Then Länge = Erg * 2 If Dist > Erg * 5 Then Länge = Erg * 5 Next Pot Länge = Länge * 1.8 Else : Länge = Dist End If LinksUnten = New Point3d(Start.X - Länge, Start.Y, Start.Z) Länge = Länge * 0.4444 LinksOben = New Point3d(LinksUnten.X, Start.Y + Länge, Start.Z) RechtsOben = New Point3d(Start.X, Start.Y + Länge, Start.Z) jigLine = New Line(Start, LinksUnten) jigLine2 = New Line(LinksOben, LinksUnten) jigLine3 = New Line(LinksOben, RechtsOben) jigLine4 = New Line(RechtsOben, Start) jigLine.ColorIndex = 7 jigLine2.ColorIndex = 7 jigLine3.ColorIndex = 7 jigLine4.ColorIndex = 7 draw.Geometry.Draw(jigLine) draw.Geometry.Draw(jigLine2) draw.Geometry.Draw(jigLine3) draw.Geometry.Draw(jigLine4) End Function Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Nov. 2010 00:30 <-- editieren / zitieren -->
Hi, wenn Du mein Beispiel nochmals ansiehst, dann brauch ich WorldDraw nicht, ich erstelle zuerst die Geometrie und die Position der Geometrie aktualisiere ich dann in der überschriebenen Function Update. Und Deine Aussage ist wie folgt zu korrigieren: ist der aktive Layer (nicht unbedingt der Layer '0') ausgeschaltet, dann siehst Du das/die JIG-Element/e nicht. Ich hätte jetzt auch probiert, vor dem Einstieg in das JIG-Handling der Blockreference einen anderen (bestehenden und eingeschalteten) Layer mitzugeben. Dann sehe ich auch die BlockRef beim ziehen. Gleiches wird auch 1:1 mit Deinen Linien funktionieren, wenn Du statt dessen eine Polylinie machst (bei Bedarf nach dem JIG in die Einzelteile zerlegst). HTH, - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|