CADsite forum

AutoCAD => Dot Net API => Topic gestart door: EddyBeerke op do 19 09 2013, 11:03:39

Titel: Custom snap [opgelost]
Bericht door: EddyBeerke op do 19 09 2013, 11:03:39
Ik zag dit artiekel:
http://through-the-interface.typepad.com/through_the_interface/2008/10/implementing-a.html

Heeft iemand hier een .dll van gemaakt, en zo ja, wil je het delen?
Ik heb geen verstand van C# (ik heb alleen VB.NET geïnstalleerd)
Titel: Re: Custom snap
Bericht door: sschevers op vr 20 09 2013, 09:29:54
Eddy,

Kijk eens naar
http://www.developerfusion.com/tools/convert/csharp-to-vb/ (http://www.developerfusion.com/tools/convert/csharp-to-vb/)

kun je de code van C# naar vb.net en vice versa omzetten

En nog een ander post over het aanmaken custom snaps (ook in C#)
http://drive-cad-with-code.blogspot.nl/2013/07/customzing-object-snap-pull-all.html (http://drive-cad-with-code.blogspot.nl/2013/07/customzing-object-snap-pull-all.html)

Op deze blog staan nog meer leuke code samples.

groeten

stephan
Titel: Re: Custom snap
Bericht door: EddyBeerke op vr 20 09 2013, 11:35:06
Bedankt ik ga er naar kijken.
Ik laat nog wat horen.
Titel: Re: Custom snap
Bericht door: winnes op vr 20 09 2013, 15:26:53
Eddy,

Gezien de hoeveelheid code die je online kan terugvinden in C#, zou ik in jouw plaats toch opteren om eventueel C# ook te installeren voor je Visual Studio.
In een solution kan je namelijk beide gaan mengen, mits inachtname van een aantal zaken.
Als je wat technisch aangelegd bent - en daar ga ik van uit - dan kan je kleine aanpassingen wel doen EN zo leer je mogelijk ook wat C# on-the-job.

Laat gerust weten mocht je alsnog die DLL an sich willen.
Zeg ook welke versie van AutoCAD je gebruikt en of het 32/64 bit is.

Gr.
winnes
Titel: Re: Custom snap
Bericht door: EddyBeerke op vr 20 09 2013, 16:13:16
Citaat van: winnes op vr 20 09 2013, 15:26:53
Eddy,

Gezien de hoeveelheid code die je online kan terugvinden in C#, zou ik in jouw plaats toch opteren om eventueel C# ook te installeren voor je Visual Studio.
In een solution kan je namelijk beide gaan mengen, mits inachtname van een aantal zaken.
Als je wat technisch aangelegd bent - en daar ga ik van uit - dan kan je kleine aanpassingen wel doen EN zo leer je mogelijk ook wat C# on-the-job.

Laat gerust weten mocht je alsnog die DLL an sich willen.
Zeg ook welke versie van AutoCAD je gebruikt en of het 32/64 bit is.

Gr.
winnes
Ik ben nog niet zo heel erg bekend met VB.NET (echt een beginner dus)

Dus als je 'm wil maken dan kan ik daar mee aan de slag.
Ik gebruik Acad 2010 x64 en Acad 2013 x64.

Ik heb de code met http://www.developerfusion.com/tools/convert/csharp-to-vb/ om gezet maar dat geeft gelijk de vraag waar moet ik de code plaatsen.
Als je het in VB.NET project doet, mag ik dan dat project ook hebben dan kan ik door de code heen proberen te lezen.

Ik gebruik Visual studio 2010 Express VB.NET.

Wat een toppers hebben we toch op dit forum!  :vreegoe:  :icon_wub:  :pintje:

P.S. Ik heb het ISO bestand voor installatie net gedownload. Nu nog eerst branden en dan kijken of de installatie wil lukken met VS-C#.NET
Titel: Re: Custom snap
Bericht door: EddyBeerke op di 24 09 2013, 14:48:05
Ik heb me de moeite genomen om Visual Studio C# Express te installeren.
En de code te plakken, references toe te voegen.
En warempel... het werkt.

Bij gevoegd het Custom_Osnap.dll

Werking (Alleen met Acad 2013 getest):
Type NETLOAD... zoek het bestand en laad het.
Dat is het!

Nu beschik je ook over de custom snap -> Als je snapt op een kwart van bv een lijn zie je nu "(¼)".

Bron can de code:
http://through-the-interface.typepad.com/through_the_interface/2008/10/implementing-a.html
Titel: Re: Custom snap
Bericht door: sschevers op di 24 09 2013, 14:53:37
Eddy,

Ik neem aan dat je dze site al kent
http://usa.autodesk.com/adsk/servlet/index?id=18162650&siteID=123112 (http://usa.autodesk.com/adsk/servlet/index?id=18162650&siteID=123112)

staan nog wat tips en tricks hoe je met vb.net /C# binnen autocad kunt werken

groeten

stephan
Titel: Re: Custom snap
Bericht door: EddyBeerke op di 24 09 2013, 16:34:56
Citaat van: sschevers op di 24 09 2013, 14:53:37
Eddy,

Ik neem aan dat je dze site al kent
http://usa.autodesk.com/adsk/servlet/index?id=18162650&siteID=123112 (http://usa.autodesk.com/adsk/servlet/index?id=18162650&siteID=123112)

staan nog wat tips en tricks hoe je met vb.net /C# binnen autocad kunt werken

groeten

stephan

Yup, die ken ik al.
Bedankt.
Titel: Re: Custom snap
Bericht door: EddyBeerke op vr 27 09 2013, 08:38:50
Met de vertaling van de Custom_Snap van C# naar VB kom ik dit tegen:

Het gaat om de vertaalde regel in rood:
CiteerPublic Sub Initialize() Implements IExtensionApplication.Initialize
            ' Register custom osnap on initialize

            _mode = New CustomObjectSnapMode("Quarter", "Quarter", "Quarter of length", _glyph)


CiteerError   1   Reference required to assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' containing the type 'System.Drawing.Bitmap'. Add one to your project.

:vraagteken: Hoe moet ik dit oplossen?



Hieronder de hele code:

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports AcGi = Autodesk.AutoCAD.GraphicsInterface

<Assembly: ExtensionApplication(GetType(OsnapApp.CustomOSnapApp))>

Namespace OsnapApp
    ' Register and unregister custom osnap

    Public Class CustomOSnapApp
        Implements IExtensionApplication
        Private _info As New QuarterOsnapInfo()
        Private _glyph As New QuarterGlyph()
        Private _mode As CustomObjectSnapMode

        Public Sub Initialize() Implements IExtensionApplication.Initialize
            ' Register custom osnap on initialize

           _mode = New CustomObjectSnapMode("Quarter", "Quarter", "Quarter of length", _glyph)

            ' Which kind of entity will use the osnap

            _mode.ApplyToEntityType(RXObject.GetClass(GetType(Polyline)), New AddObjectSnapInfo(AddressOf _info.SnapInfoPolyline))
            _mode.ApplyToEntityType(RXObject.GetClass(GetType(Curve)), New AddObjectSnapInfo(AddressOf _info.SnapInfoCurve))
            _mode.ApplyToEntityType(RXObject.GetClass(GetType(Entity)), New AddObjectSnapInfo(AddressOf _info.SnapInfoEntity))

            ' Activate the osnap

            CustomObjectSnapMode.Activate("_Quarter")
        End Sub

        ' Unregister custom osnap on terminate

        Public Sub Terminate() Implements IExtensionApplication.Terminate
            CustomObjectSnapMode.Deactivate("_Quarter")
        End Sub
    End Class

    ' Create new quarter object snap

    Public Class QuarterGlyph
        Inherits AcGi.Glyph
        Private _pt As Point3d

        Public Overrides Sub SetLocation(ByVal point As Point3d)
            _pt = point
        End Sub

        Protected Overrides Sub SubViewportDraw(ByVal vd As AcGi.ViewportDraw)
            Dim glyphPixels As Integer = CustomObjectSnapMode.GlyphSize
            Dim glyphSize As Point2d = vd.Viewport.GetNumPixelsInUnitSquare(_pt)

            ' Calculate the size of the glyph in WCS
            '  (use for text height factor)

            ' We'll add 20% to the size, as otherwise
            '  it looks a little too small

            Dim glyphHeight As Double = (glyphPixels / glyphSize.Y) * 1.2

            Dim text As String = "¼"

            ' Translate the X-axis of the DCS to WCS
            '  (for the text direction) and the snap
            '  point itself (for the text location)

            Dim e2w As Matrix3d = vd.Viewport.EyeToWorldTransform
            Dim dir As Vector3d = Vector3d.XAxis.TransformBy(e2w)
            Dim pt As Point3d = _pt.TransformBy(e2w)

            '  Draw the centered text representing the glyph

            vd.Geometry.Text(pt, vd.Viewport.ViewDirection, dir, glyphHeight, 1, 0, _
             text)
        End Sub
    End Class

    ' OSnap info

    Public Class QuarterOsnapInfo
        Public Sub SnapInfoEntity(ByVal context As ObjectSnapContext, ByVal result As ObjectSnapInfo)
            ' Nothing here
        End Sub

        Public Sub SnapInfoCurve(ByVal context As ObjectSnapContext, ByVal result As ObjectSnapInfo)
            ' For any curve

            Dim cv As Curve = TryCast(context.PickedObject, Curve)
            If cv Is Nothing Then
                Return
            End If

            Dim startParam As Double = cv.StartParam
            Dim endParam As Double = cv.EndParam

            ' Add osnap at first quarter

            Dim param As Double = startParam + ((endParam - startParam) * 0.25)
            Dim pt As Point3d = cv.GetPointAtParameter(param)

            result.SnapPoints.Add(pt)

            ' Add osnap at third quarter

            param = startParam + ((endParam - startParam) * 0.75)
            pt = cv.GetPointAtParameter(param)

            result.SnapPoints.Add(pt)
            If cv.Closed Then
                pt = cv.StartPoint
                result.SnapPoints.Add(pt)
            End If
        End Sub

        Public Sub SnapInfoPolyline(ByVal context As ObjectSnapContext, ByVal result As ObjectSnapInfo)
            ' For polylines

            Dim pl As Polyline = TryCast(context.PickedObject, Polyline)
            If pl Is Nothing Then
                Return
            End If

            ' Get the overall start and end parameters

            Dim plStartParam As Double = pl.StartParam
            Dim plEndParam As Double = pl.EndParam

            ' Get the local
            Dim startParam As Double = plStartParam
            Dim endParam As Double = startParam + 1.0

            While endParam <= plEndParam
                ' Calculate the snap point per vertex...

                ' Add osnap at first quarter

                Dim param As Double = startParam + ((endParam - startParam) * 0.25)
                Dim pt As Point3d = pl.GetPointAtParameter(param)

                result.SnapPoints.Add(pt)

                ' Add osnap at third quarter

                param = startParam + ((endParam - startParam) * 0.75)
                pt = pl.GetPointAtParameter(param)

                result.SnapPoints.Add(pt)

                startParam = endParam
                endParam += 1.0
            End While
        End Sub
    End Class
End Namespace
Titel: Re: Custom snap
Bericht door: sschevers op vr 27 09 2013, 08:50:19
Eddy,

Heb je de referenties naar de de AcDbMgd.dll en Acmdg. dll (letop copy local op false zetten) in je project toegevoegd?

stephan
Titel: Re: Custom snap
Bericht door: EddyBeerke op vr 27 09 2013, 13:19:40
Citaat van: sschevers op vr 27 09 2013, 08:50:19
Eddy,

Heb je de referenties naar de de AcDbMgd.dll en Acmdg. dll (letop copy local op false zetten) in je project toegevoegd?

stephan
Ja, deze staan idd zo ingesteld.
Ik maak gebruik van de ObjectARX 2013 template.
Daar is dit vooraf ingesteld.

Zie afbeeldingen.
Titel: Re: Custom snap
Bericht door: sschevers op vr 27 09 2013, 13:55:43
Eddy,

Ik heb net snel naar je probleem gekeken. Je moet (zoals de foutmelding als al aan geeft) nog een referentie leggen naar System.Drawing aanleggen en je bent je foutmelding kwijt.

In de bjlage vind je het project wat snel gemaakt hebt met de correcte verwijzingen. Let op: Ik werk nog met autocad Map 2012. Je moet je paden naar dus even aanpassen. Ook voor het debuggen moet je het pad aanpassen naar jouw autocad omgeving

stephan
Titel: Re: Custom snap [opgelost]
Bericht door: EddyBeerke op vr 27 09 2013, 15:25:12
Citaat van: sschevers op vr 27 09 2013, 13:55:43
Eddy,

Ik heb net snel naar je probleem gekeken. Je moet (zoals de foutmelding als al aan geeft) nog een referentie leggen naar System.Drawing aanleggen en je bent je foutmelding kwijt.

stephan
Ik moest inderdaad deze referentie toevoegen:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.dll

Geen fout meer en een werkende .dll  :vreegoe:

Wel vreemd dat het niet moet met C#. Daar werkt het gelijk zonder de code e.d. aan te passen.