Тема: В VB6 получается, а в VB.NET - NET!

Для экспорта точка в AutoCAD из приложения, написанного на VB6 я использую строчку "Set ACADP = ACADDoc.ModelSpace.AddPoint(Pt)". Тут все работает.
А в VB.NET2003 или VB2005 получается только объявлять, до экспорта (AddPoint или что-то подобное) никак не добраться!
Подскажите, пожалуйста!

Re: В VB6 получается, а в VB.NET - NET!

> ЛеШий
Выложи кусочек программы, который работает в VB6 и не работает в VB.NET
Кстати, тут на форуме уже были куски программ, которые работают в VB.NET Поищи.

Re: В VB6 получается, а в VB.NET - NET!

Посмотри здесь:
http://usa.autodesk.com/adsk/servlet/it … ;id=773180
ObjectARX2006, Samples and labs\dotNet\Ents

Re: В VB6 получается, а в VB.NET - NET!

> LeonidSN
Леонид. Ему IMHO нужно создать standalone приложение (exe-файл), а не ObjectARX .NET (dll-файл, т.е. то, что грузится при помощи Netload). Так что твоя ссылка может помочь только частично, а возможно дополнительно запутает его. :) Хотя там есть частичное описание классов-оберток. Кроме того ни слова не сказано по поводу версии AutoCAD... :(
Скорее может помочь ссылка с твоим вопросом Николаю Николаевичу: https://www.caduser.ru/forum/topic23962.html

Re: В VB6 получается, а в VB.NET - NET!

Если я правильно понял вопрос, то речь идет о различиях между VB6 и VB.NET применительно к AutoCAD. В частности, как добавить новый примитив на экран.
В VB6 мы привыкли использовать встроенную высокоуровневую функцию в виде метода ModelSpace.Add... и не интересовались, что там происходит внутри.
В VB.NET в таком случае используется технология обращения к базе данных рисунка чем-то напоминающая подход ObjectARX.
Для иллюстрации я попытался прокомментировать пример из ObjectARX2006, Samples and labs\dotNet\Ents:

Public Function CreateLine() As ObjectId
            Dim startpt As New Point3d(4.0, 2.0, 0.0)
            Dim endpt As New Point3d(10.0, 7.0, 0.0)
            Dim pLine As New Line(startpt, endpt)
            Dim lineid As ObjectId  'publick Structure
            'получение доступа к базе данных чертежа(рисунка):
            Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
            'подготовка к транзакции:
            Dim tm As DBTransMan = db.TransactionManager
            Dim ta As Transaction = tm.StartTransaction()
            Try
                'получение доступа к таблице блоков
                Dim bt As BlockTable = tm.GetObject(db.BlockTableId, OpenMode.ForRead, False)
                 'открываем "строчку" таблицы - BlockTableRecord - для записи:
                Dim btr As BlockTableRecord = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False)
                 'записываем туда наш объект pLine:
                lineid = btr.AppendEntity(pLine)
                 'готовим транзакцию по созданию нового объекта:
                tm.AddNewlyCreatedDBObject(pLine, True)
                 'запускаем эту транзакцию на выполнение:
                ta.Commit()
            Finally
                ta.Dispose()
            End Try
            Return lineid
 End Function

И метода эта не зависит от того, пишешь ты код под автономное приложение или под .dll.
Или проблема не в этом? Что скажет автор ветки?

Re: В VB6 получается, а в VB.NET - NET!

ОГРОМНОЕ всем спасибо!
Работает VB.NET2003 и VB2005 (AutoCAD 2005):
------------------------------------------------------------------------
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ACADApp As AcadApplication
        Dim ACADDoc As AcadDocument
        Dim ACADDocs As AcadDocuments
        Dim ACADPnt As AcadPoint
        Dim MS As AcadModelSpace
        ACADApp = New AcadApplication
        ACADDocs = ACADApp.Documents
        ACADDoc = ACADDocs.Add
        MS = ACADDoc.ModelSpace
        Dim Point(2) As Double
        Point(0) = 0.0#
        Point(1) = 0.0#
        Point(2) = 0.0#
        ACADPnt = ACADDoc.ModelSpace.AddPoint(Point)
        ACADApp.Visible = True
    End Sub
------------------------------------------------------------------------

Re: В VB6 получается, а в VB.NET - NET!

А у меня не получается в VB2005 кусок кода, который должен создавать новый текстовый стиль, присваивать ему шрифт и высоту, а также писать текст: все тормозится на написании текста на экране (последняя строчка в коде). IDE выдает ошибку, что значение не попадает в заданный диапазон.
Вот сам код:

Sub CreatingObjects()
        Dim AutoCAD As New AcadApplication
        Dim Document As AcadDocument
        Dim TextStyle As Interop.Common.AcadTextStyle
        Dim NewText As Interop.Common.AcadText
        Dim insertionPoint(2) As Single
        Dim height As Double
        Dim Text As String
        AutoCAD.Visible = True
        Document = AutoCAD.ActiveDocument
        TextStyle = Document.TextStyles.Add("Standard 5 mm")
        Document.ActiveTextStyle = TextStyle
        TextStyle.Height = 5.0
        TextStyle.SetFont("Times New Roman", False, False, 1, 0 Or 0 Or &H4)
        insertionPoint(0) = 0.0 : insertionPoint(1) = 0.0 : insertionPoint(2) = 0.0
        height = TextStyle.Height
        Text = "A"
        NewText = Document.ModelSpace.AddText(Text, insertionPoint(0), height)
    End Sub

Re: В VB6 получается, а в VB.NET - NET!

> Darth Sidious
Ты указываешь только первую координату вставки:
insertionPoint(0)
Попробуй так:

NewText = Document.ModelSpace.AddText(Text, insertionPoint, height)

~'J'~

Re: В VB6 получается, а в VB.NET - NET!

я уже до этого так пробовал, не получается

Re: В VB6 получается, а в VB.NET - NET!

> Darth Sidious
Только что заметил:
Dim insertionPoint(2) As Single
А разве не Double?
~'J'~

Re: В VB6 получается, а в VB.NET - NET!

Только что заметил:
Dim insertionPoint(2) As Single
А разве не Double?

Так insertionPoint при написании этого метода вообще значится как Object. ;) Попробую, конечно, написать, как Double, но не думаю, что дело в этом.

Re: В VB6 получается, а в VB.NET - NET!

Все. Оказывается, все же из-за Double и была эта ошибка. После того, как ее исправил (разумеется, и исправил

insertionPoint(0)

на

insertionPoint

) все заработало. Спасибо.