Civil 3D 2011 VB.Net Maken van een Surface object

  • Edward Winter
  • Offline Onderwerp Auteur
  • Senior lid
  • Senior lid
  • Berichten: 45

Civil 3D 2011 VB.Net Maken van een Surface object werd gestart door Edward Winter

Posted 23 mei 2011 11:56 #1957
Heren,

Ik wil in AutoCAD Civil 3D 2011 een Tin Surface maken m.b.v. VB.Net, maar ik krijg de volgende melding bij het debuggen van de .dll bij de aanroep van de CreateEmptySurface commando op oAcad.GetInterfaceObject(CIVIL3D_VER):

COMExeption was unhandled by user code

Hieronder de volledige VB.Net code opgenomen in VB Express 2008:

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices

Imports Autodesk.AEC.Interop.Base

Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.Civil.DatabaseServices
Imports Autodesk.Civil.DatabaseServices.Styles
Imports Autodesk.Civil.ApplicationServices
Imports Autodesk.Civil.Land.DatabaseServices
Imports Autodesk.Civil.Land.DatabaseServices.Styles

'Civil 3D (related) Namespaces - COM based
Imports AcadCom = Autodesk.AutoCAD.Interop
Imports AcadComCommon = Autodesk.AutoCAD.Interop.Common
Imports Civil3DCom = Autodesk.AECC.Interop.Land
Imports Civil3DComUi = Autodesk.AECC.Interop.UiLand

<Assembly: CommandClass(GetType(AU.Civil3D.Commands))>
Public Class Commands

Const ACAD_VER As String = "AutoCAD.Application"
Const CIVIL3D_VER As String = "AeccXUiLand.AeccApplication.7.0"

Public g_oCivil3D As Civil3DComUi.AeccApplication
Public g_oCivil3DDoc As Civil3DComUi.IAeccDocument
Public g_oCivil3DDb As Civil3DCom.IAeccDatabase

Public Function Civil3DObtained() As Boolean
Dim oAcad As AcadCom.AcadApplication
oAcad = GetObject(, ACAD_VER)
g_oCivil3D = oAcad.GetInterfaceObject(CIVIL3D_VER)
If g_oCivil3D Is Nothing Then
MsgBox("Error creating " & CIVIL3D_VER & ", exit.")
Return False
End If
g_oCivil3DDoc = g_oCivil3D.ActiveDocument
g_oCivil3DDb = g_oCivil3D.ActiveDocument.Database
Return True
End Sub

<CommandMethod("CreateEmptySurface")> _
Public Sub cmdCreateSurfaceEmpty()

Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Dim trans As Autodesk.AutoCAD.DatabaseServices.Transaction = tm.StartTransaction

Try
If Not Civil3DObtained() Then
Exit Sub
End If

Catch ex As Autodesk.AutoCAD.Runtime.Exception
trans.Abort()
Finally
trans.Dispose()
End Try

Dim oTinSurfaceData As New AeccLandLib.AeccTinCreationData
oTinSurfaceData.Description = "New Surface"
oTinSurfaceData.Name = "New_adsk_EG"
oTinSurfaceData.BaseLayer = "0"
oTinSurfaceData.Layer = "0"

Dim oTinSurface As AeccLandLib.AeccTinSurface
oTinSurface = g_oCivil3DDb.Surfaces.AddTinSurface(oTinSurfaceData)

End Sub

End Class

Deze bijlage is verborgen voor gasten.
Login of registreer om deze te zien.

door Edward Winter

Graag Inloggen of een account aanmaken deelnemen aan het gesprek.

  • Jeroen Tishauser
  • Offline
  • Junior lid
  • Junior lid
  • Berichten: 37

Beantwoord door Jeroen Tishauser in topic Re:Civil 3D 2011 VB.Net Maken van een Surface object

Posted 23 mei 2011 13:18 #1958
Hoi,

C3D 2011 is AeccXUiLand.AeccApplication.8.0.
Misschien dat het dat al is, maar anders;
heb je update 1 van C3D 2011 geinstalleerd? en werk je op x64? Want daar is een oplossing voor gekomen de update 1.
door Jeroen Tishauser

Graag Inloggen of een account aanmaken deelnemen aan het gesprek.

  • Jeroen Tishauser
  • Offline
  • Junior lid
  • Junior lid
  • Berichten: 37

Beantwoord door Jeroen Tishauser in topic Re:Civil 3D 2011 VB.Net Maken van een Surface object

Posted 23 mei 2011 13:25 #1959
Daarnaast even over je code;
Probeer te werken met Transacties. en probeer daar ook wat objectgerelateerd mee om te gaan. Scheelt een hoop onduidelijke foutmeldingen...

Public Class CivilApplicationManager
Shared Sub New()
Const CIVILAPPNAME As String = "AeccXUiLand.AeccApplication.8.0"
m_COMAcadApplication = TryCast(Application.AcadApplication, AcadApplication)

m_COMCivilApplication = TryCast(m_COMAcadApplication.GetInterfaceObject(CIVILAPPNAME), AeccApplication)
If m_COMCivilApplication Is Nothing Then
Throw New COMInstanceException("Unable to retrieve interface for Civil Application.", CIVILAPPNAME)
End If
End Sub


Public Shared ReadOnly Property ActiveCivilDocument() As CivilDocument
Get
Return CivilApplication.ActiveDocument
End Get
End Property
Public Shared ReadOnly Property COMActiveAcadDocument() As AcadDocument
Get
Return TryCast(m_COMAcadApplication.ActiveDocument, AcadDocument)
End Get
End Property

Public Shared ReadOnly Property COMActiveCivilDocument() As AeccDocument
Get
Return TryCast(m_COMCivilApplication.ActiveDocument, AeccDocument)
End Get
End Property

Public Shared ReadOnly Property WorkingDatabase() As Database
Get
Return HostApplicationServices.WorkingDatabase
End Get
End Property

Public Shared Function StartTransaction() As Transaction
Return HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction()
End Function

Private Shared m_COMAcadApplication As AcadApplication
Private Shared m_COMCivilApplication As AeccApplication
End Class


Public Class CivilTinSurface
Public Sub New(ByVal surfaceName As String, ByVal surfaceStyleName As String)
Dim acadDoc As AcadDocument
acadDoc = CivilApplicationManager.COMActiveAcadDocument
Dim creationData As New AeccTinCreationData()
creationData.BaseLayer = acadDoc.Layers.Item(0).Name
creationData.Layer = creationData.BaseLayer
creationData.Name = surfaceName
creationData.Description = surfaceName
creationData.Style = surfaceStyleName

m_TheSurface = CivilApplicationManager.COMActiveCivilDocument.Surfaces.AddTinSurface(creationData)
If m_TheSurface Is Nothing Then
Throw New CreateSurfaceException("Unable to create Surface object.")
End If
End Sub

Public Property Name() As String
Get
Return m_TheSurface.Name
End Get
Set(ByVal value As String)
m_TheSurface.Name = value
End Set
End Property
door Jeroen Tishauser

Graag Inloggen of een account aanmaken deelnemen aan het gesprek.

  • Edward Winter
  • Offline Onderwerp Auteur
  • Senior lid
  • Senior lid
  • Berichten: 45

Beantwoord door Edward Winter in topic Re:Civil 3D 2011 VB.Net Maken van een Surface object

Posted 23 mei 2011 13:40 #1960
Van die transactions was wel mijn bedoeling om dat (meer) te gaan gebruiken.
VB.Net is nieuw voor me. Dus eerst maar eens van VB(A) naar VB.Net proberen. Autodesk maakt het er ook niet makkelijker op om COM en NET door elkaar heen aan te bieden. Tenminste, ik vind de developers guide daar te onduidelijk over. Óf ik neem me de tijd er niet genoeg voor :-)

Enfin, bedankt voor je reactie en code voorstel. Ik zal dit eens gaan proberen, want ik krijg met mijn eigen code weer een foutmelding op dezelfde GetInterfaceObject()aanroep:

{"Unable to cast COM object of type 'System.__ComObject' to interface type 'Autodesk.AECC.Interop.UiLand.IAeccApplication'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{E9330002-0046-4186-8DF9-3D5372B7DC57}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."}

Kennelijk wordt de applicatie "Civil 3D" niet toegestaan/ondersteund in Civil 3D :-)

Ik gebruik C3D 2011 x86 met SP1.
door Edward Winter

Graag Inloggen of een account aanmaken deelnemen aan het gesprek.

  • Edward Winter
  • Offline Onderwerp Auteur
  • Senior lid
  • Senior lid
  • Berichten: 45

Beantwoord door Edward Winter in topic Re:Civil 3D 2011 VB.Net Maken van een Surface object

Posted 23 mei 2011 13:45 #1961
Ja, ik had het misschien kunnen weten...
Als ik AECVERSION in de comandregel type zie ik o.a.:

CompanyName: Autodesk, Inc.
FileDescription: AeccUiLand ARX
FileVersion: 8,0,2155,0
LegalCopyright: ©Autodesk, Inc. 1998-2010. All rights reserved.

Maar is dit wel de manier om te achterhalen met welke versie ik te maken heb?
door Edward Winter

Graag Inloggen of een account aanmaken deelnemen aan het gesprek.

  • Jeroen Tishauser
  • Offline
  • Junior lid
  • Junior lid
  • Berichten: 37

Beantwoord door Jeroen Tishauser in topic Re:Civil 3D 2011 VB.Net Maken van een Surface object

Posted 23 mei 2011 14:08 #1962
Als je - denk ik - met VB aan de gang bent heb ik een mooi voorbeeldje voor je samengesteld. Dit kan je als basis gebruiken.

het is een manier ja, autodesk geeft altijd wel aan wat je moet gebruiken voor welke versie.
Als je serieus gaat ontwikkelingen kan het interessant zijn eens naar ADN te informeren.

Deze bijlage is verborgen voor gasten.
Login of registreer om deze te zien.

door Jeroen Tishauser

Graag Inloggen of een account aanmaken deelnemen aan het gesprek.

Moderators: Pascal Wesolek