(изменено: Anatoly, 7 апреля 2011г. 14:54:54)

Тема: Динамическая вставка блока

Чтобы получить блок, "висящий на курсоре" при вставке, в Lisp/VBA используют command/SendCommand.
Как, например, здесь
SendCommand для динамической вставки блоков + обработка

А как в .Net?

Re: Динамическая вставка блока

http://through-the-interface.typepad.co … g_fro.html

Re: Динамическая вставка блока

Точнее и полнее http://through-the-interface.typepad.co … fro_1.html
Но мне не очень симпотизирует этот вариант. На мой взгляд DrawJig лучше справляется с этим вопросом, нежели EntityJig

Re: Динамическая вставка блока

А пример с DrawJig есть?

Re: Динамическая вставка блока

Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad.co … g-net.html

Re: Динамическая вставка блока

Boxa Shu пишет:

Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad....g-net.html

Тут тоже пример с EntityJig. Я конечно досконально не тестировал и не проверял, но по-моему, если использовать DrawJig, то проблем с атрибутами и не будет.

А пример с DrawJig есть?

Нет вроде. Но если разобраться (я вас имею ввиду), то можете сам сделать ;)
А если вечером мне не будет лень - могу накидать примерчик :)

Re: Динамическая вставка блока

Но если разобраться (я вас имею ввиду), то можете сам сделать

Я только начинаю .Net осваивать.

Re: Динамическая вставка блока

Александр Пекшев aka Modis пишет:

Точнее и полнее http://through-the-interface.typepad....fro_1.html
Но мне не очень симпотизирует этот вариант. На мой взгляд DrawJig лучше справляется с этим вопросом, нежели EntityJig

Boxa Shu пишет:

Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad....g-net.html

В первой ссылке есть многократная вставка блока, но выход только по Esc, по второй - вставляется один блок.
А как сделать многократную вставку, с выходом по Enter/right click?

Re: Динамическая вставка блока

do {} while ()
MSDN в помощь!
З.Ы. Можешь полазить по сайту, на который дали ссылки, посмотреть в разных примерах - там много чего можно найти. В том числе и этот вопрос

Re: Динамическая вставка блока

Взял этот пример (Jigging an AutoCAD block with attributes using .NET)

Boxa Shu пишет:

Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad....g-net.html

и переделал под свои запросы (многократная вставка блока с выходом по Enter; переписано на VB.Net)
Да простит меня Kean Walmsley за издевательство над его кодом.

В Class BlockJig, в функции Sampler заменил

 UserInputControls.NoZeroResponseAccepted

на

UserInputControls.Accept3dCoordinates Or UserInputControls.AcceptOtherInputString

Переделанный Class Commands

Public Class Commands
  Public Shared Sub BlockJigCmd(ByVal bnam, ByVal attr_arr, ByVal ub)
    Dim doc As Document = Application.DocumentManager.MdiActiveDocument
    Dim db As Database = doc.Database
    Dim ed As Editor = doc.Editor
    Dim promptResult As PromptResult
    'Dim attr_arr() As String = attr_arro 'Dim cnt As Integer
    Do
      Dim tr As Transaction = doc.TransactionManager.StartTransaction()
      Using tr
        Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
        If Not bt.Has(bnam) Then
          ed.WriteMessage(vbLf & "Block " & bnam & " not found.")
          Return
        End If

        Dim space As BlockTableRecord = _
          DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
        Dim btr As BlockTableRecord = _
          DirectCast(tr.GetObject(bt(bnam), OpenMode.ForRead), BlockTableRecord)
        ' Block needs to be inserted to current space before being able to append attribute to it
        Dim br As New BlockReference(New Point3d(), btr.ObjectId)
        space.AppendEntity(br)
        tr.AddNewlyCreatedDBObject(br, True)                    
        Dim attInfo As New Dictionary(Of ObjectId, AttInfo)()

        If btr.HasAttributeDefinitions Then
          For Each id As ObjectId In btr
            Dim obj As DBObject = tr.GetObject(id, OpenMode.ForRead)
            Dim ad As AttributeDefinition = TryCast(obj, AttributeDefinition)
            If ad IsNot Nothing AndAlso Not ad.Constant Then
              Dim ar As New AttributeReference()
              ar.SetAttributeFromBlock(ad, br.BlockTransform)
              ar.Position = ad.Position.TransformBy(br.BlockTransform)
              If ad.Justify <> AttachmentPoint.BaseLeft Then _
                  ar.AlignmentPoint = ad.AlignmentPoint.TransformBy(br.BlockTransform)
              If ar.IsMTextAttribute Then ar.UpdateMTextAttribute()
              For i = 0 To ub
                If ar.Tag = attr_arr(0, i) Then ar.TextString = attr_arr(1, i) : Exit For 
              Next

              Dim arId As ObjectId = br.AttributeCollection.AppendAttribute(ar)
              tr.AddNewlyCreatedDBObject(ar, True)
              ' Initialize our dictionary with the ObjectId of the attribute reference + attribute definition info
              attInfo.Add(arId, New AttInfo(ad.Position, ad.AlignmentPoint, ad.Justify <> AttachmentPoint.BaseLeft))
            End If
          Next
        End If
        ' Run the jig
        Dim myJig As New BlockJig(tr, br, attInfo)
        promptResult = ed.Drag(myJig)
        If promptResult.Status <> PromptStatus.OK Then Return
        tr.Commit() ' Commit changes
      End Using
    Loop
  End Sub
End Class

Запуск идет из

Public Class main_class
    <CommandMethod("BJ")> _
    Public Sub main()
    Dim bnam = "myblockname"
    Dim ub As Integer = 1 ' UBound of the array
    'массив: тэги аттрибутов / значения аттрибутов 
    Dim attr_arr(1, ub) As String
    attr_arr(0, 0) = "Tag1" : attr_arr(0, 1) = "Tag2"
    attr_arr(1, 0) = "xx" : attr_arr(1, 1) = "yy"
    Commands.BlockJigCmd(bnam, attr_arr, ub)
  End Sub
End Class

Буду благодарен за замеченные недостатки и способы их устранения.

И вопрос:
как передать двухмерный массив в виде параметра в процедуру?
А то пришлось все параметры передавать как Object.

Re: Динамическая вставка блока

Anatoly пишет:

вопрос:
как передать двухмерный массив в виде параметра в процедуру?

Ответ самому себе.
Получилось так:

Public Shared Sub BlockJigCmd(ByVal bnam As String, ByVal attr_arr(,) As String)
....................
Dim ub As Integer = attr_arr.GetUpperBound(1)
....................

Вызов

Commands.BlockJigCmd(bnam, attr_arr)

Re: Динамическая вставка блока

Anatoly пишет:

Но если разобраться (я вас имею ввиду), то можете сам сделать

Я только начинаю .Net осваивать.

Начинать осваивание дотнета с написания плагинов в автокаде - не самый лучший выбор. Лучше начинать с банального консольного "Hello World". Обёртки над ObjectArx написаны автодеском не лучшим образом. Если будешь изучать дотнет на примере работы с ними - это может негативно сказаться на дальнейшем стиле твоего программирования.
имхо.

(изменено: Anatoly, 19 апреля 2011г. 21:58:51)

Re: Динамическая вставка блока

Hwd пишет:

Начинать осваивание дотнета с написания плагинов в автокаде - не самый лучший выбор. Лучше начинать с банального консольного "Hello World". Обёртки над ObjectArx написаны автодеском не лучшим образом.

Да я и начал с этого, уже потом  стал пробовать что-то сделать в автокаде.
Но конечная цель - перейти с VBA (с которым уже лет 10) на VB.Net.
Насчет того, что AutoCad .Net API не идеален, уже читал на форуме, но, как говорит гуру А.Ривилис, лучше использовать .Net API, чем ActiveX, т.е. из двух зол выбрал меньшее.

Re: Динамическая вставка блока

Приветствую!  Уважаемые, имеется задача подобным образом (как для выше рассмотренных атрибутов) обработать свойства блока, т.е. динамически откорректировать его элементы в процессе вставки.

Есть такой код, который позволяет менять свойства:

br =new BlockReference(new Point3d(),bt["Наш блок"]);
if (br.IsDynamicBlock)
{
//Получаем коллекцию динамических свойств
foreach (DynamicBlockReferenceProperty prop in br.DynamicBlockReferencePropertyCollection )
{
  if (prop.PropertyName == "Наше свойство")
  {
   prop.Value = newValue;
  }
}
}
...
tr.Commit

:idea: Но изменения происходят после вставки, помогите реализовать свойства в : EntityJig  :cry: .

Re: Динамическая вставка блока

Похоже нет решения? EntityJig довольно ограниченная вещь?! Нашел примеры по растяжению, кручению и прочее - но это относится ко всему блоку. Как поменять отобразить изменения его составных частей, пока он "висит на курсоре"?   :?: