Сообщество программистов Autodesk в СНГ

ADN Club => VBA => Тема начата: DMA от 05-03-2019, 08:02:55

Название: Выбор последнего созданного блока.
Отправлено: DMA от 05-03-2019, 08:02:55
1. Не совсем понимаю как корректно выбрать только что созданный блок, для последующей его копирования с помощью LISPa.

Насобирал и адаптировал под себя следующее:

Код - Visual Basic [Выбрать]
  1. Public Function LispCOPY(mameb1 As Variant, mash1 As Variant, ug_povorota As Double)
  2.     Dim AblocK As AcadBlockReference
  3.     Dim pp(0 To 2) As Double
  4.     Dim oSset As AcadSelectionSet
  5.     Dim namebRET As Variant
  6.     Dim mashRET As Variant
  7.     Dim nEnts As Integer
  8.     Dim strCommand As String
  9.     Dim currLayer As AcadLayer
  10.    
  11.     Set currLayer = ThisDrawing.Layers.Add("!(DMA)--!РОЗЕТКИ")
  12.     ThisDrawing.ActiveLayer = currLayer
  13.     pp(0) = -90000: pp(1) = -90000: pp(2) = 0 ' координаты мусорного бачка
  14.    nEnts = ThisDrawing.ModelSpace.Count
  15.     Set AblocK = ThisDrawing.ModelSpace.InsertBlock(pp, mameb1, mash1, mash1, mash1, ug_povorota)
  16.     Set oSset = ThisDrawing.PickfirstSelectionSet
  17.    
  18.     'oSset.Clear
  19.    oSset.Select acSelectionSetLast
  20.     ThisDrawing.SendCommand "(sssetfirst nil (ssget " & Chr(34) & "_P" & Chr(34) & ")) "
  21.  
  22.     strCommand = "_copy" & vbCr & Str(pp(0)) & "," & Str(pp(1)) & vbCr
  23.     ThisDrawing.SendCommand strCommand
  24. End Function

Эта функция должна создавать копию заданного блока в отдаленном месте (-90000,-90000), потому как потом блок этот фиг удалишь, а там он мешаться не должен, потом выделять его и копировать "видимой вставкой"...
функция вызывается из формы (2 формы и 2 аналогичных фукнции) и в первом случае все работает как нужно, а во втором, выделение зачем-то попадает на другой блок (координатно отдаленный) и , соответственно беда с копированием...
Ткните пальцем, пожалуйста, где прочитать по теме (ничего подходящего не нарыл), как выбрать последний блок.
И еще: с чем связано не желание Lispa нормально отрабатывать строчку
    strCommand = "_copy" & vbCr & Str(pp(0)) & "," & Str(pp(1)) & vbCr
при pp(0) любого положительного значения?
Если вбить в строку конкретные значения типа & "10000,10000" &... то все корректно работает, а через переменные,- отказывается работать с положительными значениями...
Название: Re: Выбор последнего созданного блока.
Отправлено: Александр Ривилис от 05-03-2019, 15:41:21
И еще: с чем связано не желание Lispa нормально отрабатывать строчку
    strCommand = "_copy" & vbCr & Str(pp(0)) & "," & Str(pp(1)) & vbCr
при pp(0) любого положительного значения?
Если вбить в строку конкретные значения типа & "10000,10000" &... то все корректно работает, а через переменные,- отказывается работать с положительными значениями...
AutoCAD в качестве разделителя целой и дробной части использует точку, а в качестве разделителя X,Y,Z - запятую. Подозреваю, что Str(pp(0)) возвращает строковое представление дробного числа и соответственно в нём присутствует запятая (ты можешь напечатать его и проверить). Так что тебе нужно запятые в строках менять на точки.
Насобирал и адаптировал под себя следующее:
Жуть. AblocK - это и есть твой вставленный блок.
Название: Re: Выбор последнего созданного блока.
Отправлено: Александр Ривилис от 05-03-2019, 15:46:18
1. Не совсем понимаю как корректно выбрать только что созданный блок, для последующей его копирования с помощью LISPa.
Зачем это извращение с копирование при помощи LISP? Метод Copy создаёт дубликат. Дальше используя метод TransformBy ты можешь его перенести в нужную точку.
Название: Re: Выбор последнего созданного блока.
Отправлено: DMA от 05-03-2019, 16:19:02
Зачем это извращение с копирование при помощи LISP? Метод Copy создаёт дубликат. Дальше используя метод TransformBy ты можешь его перенести в нужную точку.
У меня задача, в данном случае, создать множественную вставку в чертеж объекта, который при этом еще и будет "висеть на мышке", просто переместить единичный блок я могу запросив координату перед вставкой, но не удобно. В это извращение с Лиспом и полез только найдя на одном из форумов схожую задачу, котоhe. лиспом пытались решить , упомянув что в VBA такое не возможно.
Название: Re: Выбор последнего созданного блока.
Отправлено: DMA от 05-03-2019, 16:25:58
AutoCAD в качестве разделителя целой и дробной части использует точку, а в качестве разделителя X,Y,Z - запятую. Подозреваю, что Str(pp(0)) возвращает строковое представление дробного числа и соответственно в нём присутствует запятая (ты можешь напечатать его и проверить). Так что тебе нужно запятые в строках менять на точки.
Проверил,  msgbox возвращает корректную строку. Дело здесь именно в знаке. С отрицательными значениями работает, с положительными нет... Магия, однако.
Название: Re: Выбор последнего созданного блока.
Отправлено: Александр Ривилис от 05-03-2019, 16:55:52
Проверил,  msgbox возвращает корректную строку.
Не уверен. Знак роли играть не должен.
Название: Re: Выбор последнего созданного блока.
Отправлено: DMA от 05-03-2019, 16:58:07
Не уверен. Знак роли играть не должен.
Карма у меня похоже такая :)) Неоднократно уже проявляется подобное.
Название: Re: Выбор последнего созданного блока.
Отправлено: Александр Ривилис от 05-03-2019, 17:13:35
У меня задача, в данном случае, создать множественную вставку в чертеж объекта, который при этом еще и будет "висеть на мышке", просто переместить единичный блок я могу запросив координату перед вставкой, но не удобно.
Если стоят такие задачи, то нужно бросать тратить время на VBA и переходить на AutoCAD .NET API (C# или на крайний случай VB.NET).