| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > "VB.net для чайников". Вопросы программирования под Autocad и ©.

"VB.net для чайников". Вопросы программирования под Autocad и ©.

Ответ
Поиск в этой теме
Непрочитано 13.12.2010, 10:58
"VB.net для чайников". Вопросы программирования под Autocad и ©.
AlexV
 
Инженер
 
С-Пб
Регистрация: 02.10.2008
Сообщений: 3,685

Есть у нас популярная тема: Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) .. Есть, конечно, и это и, но хотелось бы иметь аналогичную возможность задавать тупые (для начала очень тупые) вопросы по VB.Net здесь..
Простейший пример из ссылки в теме про миграцию VBA - Net посмотрел..
Имеем проект - "библиотеку классов", с подключенными ссылками (на рисунке).



Имеем код, который при загрузке построенной dll-ки "добавляет" в автокад команду mAddPnt, создающую точку..
Код:
[Выделить все]
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Public Class AdskCom
    Public ReadOnly Property ThisDrawing() As AcadDocument
        Get
            Return Autodesk.AutoCAD _
            .ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property
    <Autodesk.AutoCAD.Runtime.CommandMethod("mAddPnt")> _
    Public Sub mAddPnt()
        On Error Resume Next
        Dim location(0 To 2) As Double
        location(0) = 5.0# : location(1) = 5.0# : location(2) = 0.0#
        location = ThisDrawing.Utility.GetPoint(, "Укажите точку")
        ThisDrawing.ModelSpace.AddPoint(location)
    End Sub
End Class
Возникают следующие вопросы:
1. Строки "Imports Autodesk.AutoCAD.Interop" импортируют в проект соответствующие "пространства имен" - объектные модели, позволяя использовать их в проекте.. На вкладке "Ссылки" есть также список "Импортированные пространства имен"; - "галочка" на соответствующей библиотеке - аналогична ли строке "Imports Autodesk...." и если да то в чем разница?

2. Как быть с импортом библиотек, если предполагается использовать программу и под 64, и под 32 бит?

3. В проект библиотеки классов возможно добавлять формы. Каким образом эту самую "Form1" вызвать на экран? Методом тыка попробовал в "Public Sub mAddPnt()" влепить строку "Form1.ActiveForm.Activate()", но эта единственное, к чему она приводит, - к вылету автокада с фатал эррором..

4. Нижележащая процедура позволяет получить список установленных языков и замечательно работает в приложениях "Windows Forms". Свойство ".InputLanguage" принадлежит пространству имен "System.Windows.Forms". Возможно ли применить его в случае моего кода?
Может, надо импортировать эти самые пространства в проект..
Код:
[Выделить все]
 Public Sub GetLanguages()
    ' Gets the list of installed languages.
    Dim lang As InputLanguage
    For Each lang In  InputLanguage.InstalledInputLanguages
        textBox1.Text &= lang.Culture.EnglishName & ControlChars.Cr
    Next lang
End Sub 'GetLanguages
5. Строка
<Autodesk.AutoCAD.Runtime.CommandMethod("mAddPnt")> _
"создает" новую команду, при введении имени которой в комстроке автокада выполняется процедура mAddPnt. А как создать процедуру, которая должна реагировать на события приложения Acad-а, - некий аналог "AcadDocument_BeginCommand(ByVal CommandName As String)" в VBA?

6. Код снизу дает возможность использовать привычную объектную модель ThisDrawing... А возможно ли аналогично использовать объектную модель ASD при подключенных его библиотеках?
Код:
[Выделить все]
Public ReadOnly Property ThisDrawing() As AcadDocument
        Get
            Return Autodesk.AutoCAD _
            .ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property
вот первые 6 из примерно 1000 возникающих вопросов..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 121631
 
Непрочитано 23.08.2013, 18:21
#161
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Do$
Дык там еще переменные надо будет импортировать...
Ща заново проект создам все вычищу....
У меня сейчас чей то вообще ничего не работает, где то ошибка, хотя компилируется все без ошибок....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 23.08.2013, 20:34
#162
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Если запустить в режиме отладки, покажет где ошибка.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 23.08.2013, 20:56
#163
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


та нашел уже....
Действительно надо модуль делать, так правильнее будет.
При добавлении методов и функций в модуль, к ним можно будет обращаться как из формы, так и из класса.
Такая структура будет более правильная в общем то.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.

Последний раз редактировалось DEM, 24.08.2013 в 10:51.
DEM вне форума  
 
Непрочитано 26.08.2013, 15:14
#164
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


В общем, вот так поступил...
Вывел методы в Модуль, и могу спокойно из вызывать из формы и из классов....
Теперь вот вопросы такие возникли...
Как вставлять таблицу в определенную точку с отображением её контура...
Я так понимаю, можно вставлять её в виде блока, а потом разбивать.
Или есть еще какие то приемы?
И еще преположим у меня есть какой то стиль таблицы, как мне его назначить, новой таблице?
Вложения
Тип файла: zip SpeciF.zip (110.2 Кб, 76 просмотров)
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 26.08.2013, 21:32
#165
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


NET такая штука, что она не зависит от языка. Будь то VB или C#, NET API AutoCAD от этого не изменится. Поэтому, можно посмотреть примеры создания таблиц на C# и сделать то же самое в VB:
http://through-the-interface.typepad...ng_an_aut.html
http://through-the-interface.typepad...using-net.html
http://through-the-interface.typepad...le-in-net.html
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 26.08.2013, 22:11
#166
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Do$
Там в примерах варианты с указанием точки, но без контура таблицы.
Может в буфер обмена таблицу поместить, а потом вставить....
И еще где то примеры бы с трансформацией USC...
А то вставляются таблицы под наклоном, если USC повернута.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 26.08.2013, 23:49
#167
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Что подразумевается под контуром? Граничные линии ячеек? Они в стилях таблиц/ячеек настраиваются. Или отдельно для каждой созданной таблицы/ячейки можно переопределить.
По умолчанию все создается в WCS ("мировой" системе координат), если в текущей UCS надо, то пересчитывается геометрия. Создается матрица пересчета и векторы/точки пересчитываются по ней, даже метод есть у них специальный. Погугли, в общем: "WCS to USC AutoCAD NET" или что-то подобное.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 27.08.2013, 07:16
#168
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от Do$ Посмотреть сообщение
Что подразумевается под контуром? Граничные линии ячеек?
Хочестя вставлять таблицу, так же как и блоки, чтобы при указании точки, таблица была видима контуром(ну или вся)....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 27.08.2013, 09:15
#169
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от DEM Посмотреть сообщение
Хочестя вставлять таблицу, так же как и блоки, чтобы при указании точки, таблица была видима контуром(ну или вся)....
http://through-the-interface.typepad...a_jig_fro.html
Boxa вне форума  
 
Непрочитано 27.08.2013, 12:31
#170
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Угу получилось на VB.
Теперь почистить код надо еще....
Код:
[Выделить все]
[VB]       <CommandMethod("neww")> _
        Public Sub CreateBlockWithJig11()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            ' First let's get the name of the block
            AddNewBTRB()
            Dim pr = "CircleBlock"
            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using tr
                ' Then open the block table and check the
                ' block definition exists
                Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                Dim blockId As ObjectId = bt("CircleBlock")
                    ' We loop until the jig is cancelled
                Dim pt As New Point3d(0, 0, 0)
                        Dim br As New BlockReference(pt, blockId)
                        Dim entJig As New BlockJig(br)
                        ' Perform the jig operation
                ' Call a function to make the graphics display
                            ' (otherwise it will only do so when we Commit)
                doc.TransactionManager.QueueForGraphicsFlush()
                Dim pkr As PromptResult = ed.Drag(entJig)
                If pkr.Status = PromptStatus.OK Then
                    ' If all is OK, let's go and add the
                    ' entity to the modelspace
                    Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                    btr.AppendEntity(entJig.GetEntity())
                    tr.AddNewlyCreatedDBObject(entJig.GetEntity(), True)
                    ' Call a function to make the graphics display
                    ' (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush()
                End If
                tr.Commit()
            End Using

        End Sub
        Public Sub AddNewBTRB()
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord

            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open the database for Write
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForWrite)

            'Add a new BlockTableRecord
            myBTR = New BlockTableRecord
            myBTR.Name = "CircleBlock"

            'Draw to the Block
            myBTR.AppendEntity(New DatabaseServices.Circle( _
                New Geometry.Point3d(0, 0, 0), New Geometry.Vector3d(0, 0, 1), 1.5))

            myBT.Add(myBTR)

            'Commit the Transaction
            myTrans.AddNewlyCreatedDBObject(myBTR, True)
            myTrans.Commit()

            'Dispose of the Transaction Objects
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub[/VB]
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 27.08.2013, 15:46
#171
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от DEM Посмотреть сообщение
Угу получилось на VB.
Теперь почистить код надо еще...
У тебя в коде не не проверяется есть ли уже в базе чертежа блок с таким именем...
Код:
[Выделить все]
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
        Dim acEd As Editor = acDoc.Editor
        Dim sec_block_name As String = "Sech"
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim acBlTbl As BlockTable
            acBlTbl = acTrans.GetObject(acCurDb.BlockTableId, _
                                         OpenMode.ForRead)
            If acBlTbl.Has(sec_block_name) = True Then
                acDoc.Editor.WriteMessage(vbLf & "Хорошо, блок " & sec_block_name & " присутствует в базе чертежа. ")
            Else
                acDoc.Editor.WriteMessage(vbLf & "Ошибка, блок " & sec_block_name & " отсутствует в базе чертежа. ")
                acDoc.Editor.WriteMessage(vbLf & "Программа завершена с ошибкой.")
                Exit Sub
            End If
        End Using
Boxa вне форума  
 
Непрочитано 27.08.2013, 16:14
#172
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Boxa
Ок, а вот как добавить столбцы и строки в таблицу, не разберусь, и как разбить потом этот блок?
Код:
[Выделить все]
[VB]        Public Sub AddNewBTRB()
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord

            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open the database for Write
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForWrite)

            'Add a new BlockTableRecord
            myBTR = New BlockTableRecord
            myBTR.Name = "Table_Block"

            'Draw to the Block
            'Dim myTable As New DatabaseServices.Table
            'myBTR.AppendEntity(myTable)
            'myTrans.AddNewlyCreatedDBObject(myTable, True)
            'myTable.InsertColumns(1, 0.25, 4)
            'myTable.InsertRows(1, 1, 3)
            myBTR.AppendEntity(New DatabaseServices.Table())
            myBT.Add(myBTR)
            'Commit the Transaction
            myTrans.AddNewlyCreatedDBObject(myBTR, True)
            myTrans.Commit()

            'Dispose of the Transaction Objects
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub[/VB]
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 28.08.2013, 10:56
#173
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


2 DEM
Ээээ... ты как то все через одно место стараешься сделать...
Код:
[Выделить все]
Public Class acad_boxa_tabJig
    <CommandMethod("neww_tab", CommandFlags.NoBlockEditor+CommandFlags.NoPaperSpace)> _
    Public Sub CreateBlockWithJig11_tab()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim tr As Transaction = doc.TransactionManager.StartTransaction()
        Using tr
            Dim tabId As ObjectId = CreateAndSetTableStyle(New Point3d(0, 0, 0))
            Dim acTab As Table = CType(tr.GetObject(tabId, OpenMode.ForRead), Table)
            Dim entJig As New TabJig(acTab)
            doc.TransactionManager.QueueForGraphicsFlush()
            Dim pkr As PromptPointResult = ed.Drag(entJig)
            If pkr.Status = PromptStatus.OK Then
                acTab.UpgradeOpen()
                acTab.Position = pkr.Value
                acTab.GenerateLayout()
                acTab.DowngradeOpen()
                doc.TransactionManager.QueueForGraphicsFlush()
            End If
            tr.Commit()
        End Using
    End Sub

    Private Function CreateAndSetTableStyle(ByRef acPnt As Point3d) As ObjectId
        Dim sTableStyleName As String = "SV"
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
        Dim acEd As Editor = acDoc.Editor
        Dim TableStyleId As ObjectId
        Dim tbID As ObjectId

        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim ts As TableStyle
            Dim TableDict As DBDictionary = CType(acTrans.GetObject(acCurDb.TableStyleDictionaryId, _
                                                                    OpenMode.ForRead), DBDictionary)
            If TableDict.Contains(sTableStyleName) Then
                TableStyleId = TableDict.GetAt(sTableStyleName)
            Else
                'Создаем стиль таблице
                ts = New TableStyle()
                'Высота текста в таблице
                ts.SetTextHeight(350, RowType.HeaderRow)
                ts.SetTextHeight(350, RowType.DataRow)
                ts.SetTextHeight(500, RowType.TitleRow)
                'Выравнивание  текста в таблице
                ts.SetAlignment(CellAlignment.MiddleCenter, RowType.HeaderRow)
                ts.SetAlignment(CellAlignment.MiddleCenter, RowType.TitleRow)
                ts.SetAlignment(CellAlignment.MiddleCenter, RowType.DataRow)
                ts.IsHeaderSuppressed = False
                ts.IsTitleSuppressed = False
                TableStyleId = ts.PostTableStyleToDatabase(acCurDb, sTableStyleName)
                acTrans.AddNewlyCreatedDBObject(ts, True)
            End If
            'Берем текстовый стиль
            ts = CType(acTrans.GetObject(TableStyleId, OpenMode.ForWrite), TableStyle)
            'Формирую таблицу
            Dim tb As Table = New Table()
            If TableStyleId = ObjectId.Null Then
                tb.TableStyle = acCurDb.Tablestyle
            Else
                tb.TableStyle = TableStyleId
            End If
            tb.Rows(0).Height = 800
            tb.InsertRows(1, 1600, 1)
            tb.InsertColumns(0, 2000, 1)
            tb.InsertColumns(1, 3000, 1)
            tb.InsertColumns(2, 1500, 1)
            tb.InsertColumns(3, 2000, 4)
            tb.InsertColumns(7, 1500, 1)
            tb.Columns(8).Width = 2500
            'Заголовок таблици
            tb.Cells(0, 0).TextHeight = 500
            tb.Cells(0, 0).TextString = "Спецификация свай"
            tb.Cells(0, 0).Alignment = CellAlignment.MiddleCenter
            'Заполняю шапку таблицы
            Dim str(8) As String
            str(0) = "Номера  свай"
            str(1) = "Марка свай"
            str(2) = "Условн. обозн."
            str(3) = "Длина, мм"
            str(4) = "Сечение, мм"
            str(5) = "Абс. отм.  пяты сваи"
            str(6) = "Абс. отм. верха сваи"
            str(7) = "Кол-во, шт."
            str(8) = "Примечание"
            For i = 0 To 8
                tb.Cells(1, i).TextString = str(i)
                tb.Cells(1, i).TextHeight = 300
                tb.Cells(1, i).Alignment = CellAlignment.MiddleCenter
            Next
            'Указываю точку вставки таблицы
            tb.Position = acPnt 'out_Re.Value
            tb.GenerateLayout()
            Dim acBlkTbl As BlockTable
            Dim acBlkTblRec As BlockTableRecord
            ' Save the changes and dispose of the transaction
            Try
                ' Save the changes and dispose of the transaction
                acBlkTbl = CType(acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead), BlockTable)
                acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                acBlkTblRec.AppendEntity(tb)
                tbID = tb.ObjectId
                acTrans.AddNewlyCreatedDBObject(tb, True)
                acTrans.Commit()
            Catch ex As Exception
                acDoc.Editor.WriteMessage(ControlChars.CrLf & "Не удалось добавить стиль таблици в базу чертежа.")
            End Try
        End Using
        Return tbID
    End Function
End Class

Class TabJig
    Inherits EntityJig
    Private mCenterPt As Point3d, mActualPoint As Point3d

    Public Sub New(br As Table)
        MyBase.New(br)
        mCenterPt = br.Position
    End Sub

    Protected Overrides Function Sampler(prompts As JigPrompts) As SamplerStatus
        Dim jigOpts As New JigPromptPointOptions()
        jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates Or UserInputControls.NoZeroResponseAccepted Or UserInputControls.NoNegativeResponseAccepted)
        jigOpts.Message = vbLf & "Enter insert point: "
        Dim dres As PromptPointResult = prompts.AcquirePoint(jigOpts)
        If mActualPoint = dres.Value Then
            Return SamplerStatus.NoChange
        Else
            mActualPoint = dres.Value
        End If
        Return SamplerStatus.OK
    End Function

    Protected Overrides Function Update() As Boolean
        mCenterPt = mActualPoint
        Try
            DirectCast(Entity, Table).Position = mCenterPt
        Catch generatedExceptionName As System.Exception
            Return False
        End Try
        Return True
    End Function

    Public Function GetEntity() As Entity
        Return Entity
    End Function
End Class

Последний раз редактировалось Boxa, 28.08.2013 в 12:31.
Boxa вне форума  
 
Непрочитано 28.08.2013, 11:16
#174
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Boxa
Ну я пока еще учусь на херурга...
Код:
[Выделить все]
[VB]Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD

Namespace BlockJigTest
    Class BlockJig
        Inherits EntityJig
        Private mCenterPt As Point3d, mActualPoint As Point3d
        Public Sub New(ByVal br As BlockReference)
            MyBase.New(br)
            mCenterPt = br.Position
        End Sub
        Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus
            Dim jigOpts As New JigPromptPointOptions()
            jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates Or UserInputControls.NoZeroResponseAccepted Or UserInputControls.NoNegativeResponseAccepted)
            jigOpts.Message = vbLf & "Enter insert point: "
            Dim dres As PromptPointResult = prompts.AcquirePoint(jigOpts)
            If mActualPoint = dres.Value Then
                Return SamplerStatus.NoChange
            Else
                mActualPoint = dres.Value
            End If
            Return SamplerStatus.OK
        End Function
        Protected Overrides Function Update() As Boolean
            mCenterPt = mActualPoint
            Try
                DirectCast(Entity, BlockReference).Position = mCenterPt
            Catch generatedExceptionName As System.Exception
                Return False
            End Try
            Return True
        End Function
        Public Function GetEntity() As Entity
            Return Entity
        End Function
    End Class
    Public Class Commands
        <CommandMethod("neww")> _
        Public Sub CreateBlockWithJig11()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            ' First let's get the name of the block
            AddNewBTRB()
            Dim pr = "Table_Block"
            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using tr
                ' Then open the block table and check the
                ' block definition exists
                Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                Dim blockId As ObjectId = bt(pr)
                ' We loop until the jig is cancelled
                Dim pt As New Point3d(0, 0, 0)
                Dim br As New BlockReference(pt, blockId)
                Dim entJig As New BlockJig(br)
                ' Perform the jig operation

                Dim pkr As PromptResult = ed.Drag(entJig)
                If pkr.Status = PromptStatus.OK Then
                    ' If all is OK, let's go and add the
                    ' entity to the modelspace
                    Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                    btr.AppendEntity(entJig.GetEntity())
                    'Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite), BlockTableRecord)
                    'btr.AppendEntity(entJig.GetEntity())
                    tr.AddNewlyCreatedDBObject(entJig.GetEntity(), True)
                    ' Call a function to make the graphics display
                    ' (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush()
                End If
                br.ExplodeToOwnerSpace()
                br.Erase()

                tr.Commit()
            End Using


        End Sub
        Public Sub AddNewBTRB()
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord

            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open the database for Write
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForWrite)

            'Add a new BlockTableRecord
            myBTR = New BlockTableRecord
            myBTR.Name = "Table_Block"
            Dim tb As New DatabaseServices.Table()
            tb.InsertColumns(1, 0.25, 4)
            tb.InsertRows(1, 1, 3)
            myBTR.AppendEntity(tb)
            myBT.Add(myBTR)
            'Commit the Transaction
            myTrans.AddNewlyCreatedDBObject(myBTR, True)
            myTrans.Commit()
            'Dispose of the Transaction Objects
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub



    End Class

End Namespace[/VB]
В принципе то что надо получилось, но повторно не получается запустить команду, т.к. такой блок уже имеется....
Его надо удалить из таблицы блоков...
Твой код конечно же более правильный, ща буду разбираться....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 28.08.2013, 11:41
#175
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от DEM Посмотреть сообщение
В принципе то что надо получилось, но повторно не получается запустить команду, т.к. такой блок уже имеется....
ответ тут: http://forum.dwg.ru/showpost.php?p=1...&postcount=171
Boxa вне форума  
 
Непрочитано 28.08.2013, 11:53
#176
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Boxa
Мне кажется его удалять лучше из базы, т.к. он все равно временный....
Возможно следует сделать проверку на то сущетсвует ли блок, а потом еще и удалить его...
PS. У тебя там тоже косячек в коде, нету проверки на то в какое пространство активное....
ЕСли например находишься в пространстве листа, то таблица вставляется в пространстве модели, и при этом не отображается её контур....
Я понимаю что гдей то вот тут надо применить метод, по удалению блока из базы, но не могу его ни как применить...
Цитата:
br.ExplodeToOwnerSpace()
br.Erase()-не работает...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 28.08.2013, 12:25
#177
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от DEM Посмотреть сообщение
Мне кажется его удалять лучше из базы, т.к. он все равно временный....
Да не нужен тебе этот блок. Ты посмотри внимательно на код в CreateBlockWithJig11, там ты вызываешь процедуру создания блока, а потом получаешь ID этого блока и работаешь уже с ним, для Jig все равно с каким объектом работать, ID передал и ладно. Кто тебе не дает так же работать с таблицей? Текстом? Линией? Окружностью? Разницы то никакой.
Просто скопируй код из 173 сообщения в новый проект и все, в функции CreateAndSetTableStyle настраивай и заполняй таблицу как тебе хочется.


PS. Это не косяк, это фитча. =)
Там все размеры таблицы заданы для работы в модели. При этом этот кусок кода вырванный из проекта. В моем коде команду neww_tab необходимо запускать с флагами NoBlockEditor и NoPaperSpace. Код в 173 поправил.

Последний раз редактировалось Boxa, 28.08.2013 в 12:31.
Boxa вне форума  
 
Непрочитано 28.08.2013, 12:39
#178
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от Boxa Посмотреть сообщение
Да не нужен тебе этот блок. Ты посмотри внимательно на код в CreateBlockWithJig11, там ты вызываешь процедуру создания блока, а потом получаешь ID этого блока и работаешь уже с ним, для Jig все равно с каким объектом работать, ID передал и ладно
А че ты материшься???
НУ слушай я с VB.net пока на вы....
3-ю неделю только разбираюсь
Ща разберусь в твоем коде...
Спасиб еще раз....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 30.08.2013, 11:34
#179
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Извлечение и добавление данных в колонку dtDataTable с классом List
Код:
[Выделить все]
        Dim dsDataSet As SysD.DataSet = New SysD.DataSet("DocumentDataSet")
        Dim dtDataTable As SysD.DataTable = New SysD.DataTable("Documents")
        dtDataTable.Columns.Add("Name", GetType(String))
        dtDataTable.Columns.Add("Atrib", GetType(IList(Of String)))
        dtDataTable.NewRow()
        dtDataTable.Rows.Add()
        dtDataTable.Rows(0).Item(0) = "ewf"
        dtDataTable.Rows(0).Item(1) = {"wef", "efwwe3", "wfqf"}
ДАнные извлечь к сожалению не получается...
Может сделать как то по другому.

Вопрос снят, разобрался
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.

Последний раз редактировалось DEM, 30.08.2013 в 11:47.
DEM вне форума  
 
Непрочитано 30.08.2013, 11:59
#180
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Эта строка не применима к System.Data.DataTable:
Код:
[Выделить все]
dtDataTable.Columns.Add("Atrib", GetType(IList(Of String)))
Ты можешь использовать только простые типы System.Data,
для списка атрибутов только один столбец для каждого,
название столбца - тэг атрибута, значение по соответствию
См. документацию по DataTable, пригодится...
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > "VB.net для чайников". Вопросы программирования под Autocad и ©.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Ноутбук б/у и AutoCad 2D - вопросы Elenka AutoCAD 14 23.12.2005 13:47
Ноутбук б/у и AutoCad 2D - вопросы Elenka AutoCAD 1 20.12.2005 21:33
AUTOCAD 2006 Aragorn AutoCAD 14 01.04.2005 00:55
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48