Выбор последнего созданного блока.

Автор Тема: Выбор последнего созданного блока.  (Прочитано 6866 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DMAАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 0
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" &... то все корректно работает, а через переменные,- отказывается работать с положительными значениями...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
И еще: с чем связано не желание Lispa нормально отрабатывать строчку
    strCommand = "_copy" & vbCr & Str(pp(0)) & "," & Str(pp(1)) & vbCr
при pp(0) любого положительного значения?
Если вбить в строку конкретные значения типа & "10000,10000" &... то все корректно работает, а через переменные,- отказывается работать с положительными значениями...
AutoCAD в качестве разделителя целой и дробной части использует точку, а в качестве разделителя X,Y,Z - запятую. Подозреваю, что Str(pp(0)) возвращает строковое представление дробного числа и соответственно в нём присутствует запятая (ты можешь напечатать его и проверить). Так что тебе нужно запятые в строках менять на точки.
Насобирал и адаптировал под себя следующее:
Жуть. AblocK - это и есть твой вставленный блок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Не совсем понимаю как корректно выбрать только что созданный блок, для последующей его копирования с помощью LISPa.
Зачем это извращение с копирование при помощи LISP? Метод Copy создаёт дубликат. Дальше используя метод TransformBy ты можешь его перенести в нужную точку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMAАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 0
Зачем это извращение с копирование при помощи LISP? Метод Copy создаёт дубликат. Дальше используя метод TransformBy ты можешь его перенести в нужную точку.
У меня задача, в данном случае, создать множественную вставку в чертеж объекта, который при этом еще и будет "висеть на мышке", просто переместить единичный блок я могу запросив координату перед вставкой, но не удобно. В это извращение с Лиспом и полез только найдя на одном из форумов схожую задачу, котоhe. лиспом пытались решить , упомянув что в VBA такое не возможно.

Оффлайн DMAАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 0
AutoCAD в качестве разделителя целой и дробной части использует точку, а в качестве разделителя X,Y,Z - запятую. Подозреваю, что Str(pp(0)) возвращает строковое представление дробного числа и соответственно в нём присутствует запятая (ты можешь напечатать его и проверить). Так что тебе нужно запятые в строках менять на точки.
Проверил,  msgbox возвращает корректную строку. Дело здесь именно в знаке. С отрицательными значениями работает, с положительными нет... Магия, однако.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил,  msgbox возвращает корректную строку.
Не уверен. Знак роли играть не должен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMAАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 0
Не уверен. Знак роли играть не должен.
Карма у меня похоже такая :)) Неоднократно уже проявляется подобное.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня задача, в данном случае, создать множественную вставку в чертеж объекта, который при этом еще и будет "висеть на мышке", просто переместить единичный блок я могу запросив координату перед вставкой, но не удобно.
Если стоят такие задачи, то нужно бросать тратить время на VBA и переходить на AutoCAD .NET API (C# или на крайний случай VB.NET).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение