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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получение идентификатора последнего введенного объекта

Получение идентификатора последнего введенного объекта

Ответ
Поиск в этой теме
Непрочитано 23.04.2010, 12:57 #1
Получение идентификатора последнего введенного объекта
dxaritonov
 
Регистрация: 23.04.2010
Сообщений: 7

Добрый день, господа. Я новичек в плане работы с автокадом через ole-сервер, поэтому не судите строго.
Мне необходимо сделать так, чтобы я посылал команду в автокад отрисовки линии или круга, пользователь задавал мышой необходимые координаты, и мне необходимо получить идентификатор последнего нарисованного объекта.
Работаю в связке Delphi+AutoCAD
При попытке сделать следующее
Код:
[Выделить все]
modelSpace.SendCommand('_Line ');
modelSpace.SendCommand('(setvar tmp entlast) ');
varData := modelSpace.GetVariable('tmp');
строка, выделенная жирным, выдает ошибку "Вызов был отклонен".
Требуется ваша помощь. Как я могу получить идентификатор последнего отрисованного объекта и как я могу тормознуть дальнейшее выполнение кода Delphi, пока пользователь не нарисует линию.
Заранее благодарю.
Просмотров: 4396
 
Непрочитано 23.04.2010, 14:34
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Любой объект Автокада имеет свойство Handle. Это уникальная метка - шестнадцатицеричое число, преобразованное в строку.
Получить метку - handle=Object.handle (это будет строка)
Получить по метке указатель на объект - ThisDrawing.HandleToObject(handle)
Sub Example_HandleToObject()
' This example creates a spline in model space, and returns the
' handle for the spline. Then the spline is returned from the handle and colored.

' Create the spline
Dim splineObj As AcadSpline
Dim startTan(0 To 2) As Double
Dim endTan(0 To 2) As Double
Dim fitPoints(0 To 8) As Double

startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0
endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0
fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0
fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0
fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0
Set splineObj = ThisDrawing.ModelSpace.AddSpline(fitPoints, startTan, endTan)

ZoomAll

' Find the handle of the spline
Dim handle As String
handle = splineObj.handle
MsgBox "The handle of the Spline is: " & splineObj.handle, , "HandleToObject Example"

' Find an object from a given handle
Dim tempObj As AcadObject
Set tempObj = ThisDrawing.HandleToObject(handle)

' Now use the newly initialized object variable to color the object
Dim color As AcadAcCmColor
Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.16")
Call color.SetRGB(80, 100, 244)

tempObj.TrueColor = color

ThisDrawing.Regen True
MsgBox "The Spline is now blue.", , "ObjectIDToObject Example"

End Sub


Цитата:
Как я могу получить идентификатор последнего отрисованного объекта
Выделено синим
Цитата:
и как я могу тормознуть дальнейшее выполнение кода Delphi, пока пользователь не нарисует линию.
Выделено красным

LISP
Код:
[Выделить все]
(progn(command "_LINE")(while (> (getvar "CMDACTIVE") 0)(command pause)))
(setvar "USERS1" (if (= (cdr(assoc 0 (entget(entlast)))) "LINE")(cdr(assoc 5 (entget(entlast)))) ""))
Код (без проверок)
Код:
[Выделить все]
modelSpace.SendCommand("(progn(command \"_LINE\")(while (> (getvar \"CMDACTIVE\") 0)(command pause)))\n");
modelSpace.SendCommand("(setvar \"USERS1\" (if (= (cdr(assoc 0 (entget(entlast)))) \"LINE\")(cdr(assoc 5 (entget(entlast)))) \"\"))\n");
varData := modelSpace.GetVariable("USERS1");  \\ String
LineObect := modelSpace.HandleToObject (varData)
Завершай строку в SendCommand символом "\n" (нажатие Enter)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 23.04.2010, 14:56
#3
dxaritonov


 
Регистрация: 23.04.2010
Сообщений: 7


Спасибо, VVA, за приведенный пример.
Обязательно его попробую.
А пока приведу еще один вариант решения данной проблемы средствами делфи, не используя лисп:
Код:
[Выделить все]
  app := CreateOleObject('AutoCAD.Application.17');
  (app as IAcadApplication).Visible := true;
  acadDoc := (app as IAcadApplication).ActiveDocument;
  acadDoc.SendCommand('_Line ');
  ShowMessage('wait');
  varData := acadDoc.ModelSpace.Item(acadDoc.ModelSpace.Count-1).ObjectID;
Единственный минус - жирная строка, как еще тормознуть выполнине кода...возможно буду крутиться в пустом цикле. Но факт есть факт. ИД известен.
Возможно, кому-то пригодится

P.S.: Значения системных переменных так получить и не получается. Не знаю в чем дело. Где-то на одном из форумов видел, что перед получением значения переменной надо блокировать документ. Это правда? И как это сделать?

Последний раз редактировалось dxaritonov, 23.04.2010 в 15:13.
dxaritonov вне форума  
 
Непрочитано 23.04.2010, 15:27
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


В примере из #1 tmp - это не автокадовская переменная, а просто переменная лиспа. Список и значение всех автокадовских переменных можно получить командой _setvar далее ? и *. Только к ним можно применять GetVariable. По поводу передачи данных LISP<->VBA почитай LISP & VBA. Передача данных. Тормознуть можно лиспом. Выделил в #2 красным
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 23.04.2010, 15:32
#5
dxaritonov


 
Регистрация: 23.04.2010
Сообщений: 7


Список всех системных автокадовских переменных есть (в хелпе нашел), в делфе когда вызываю
Код:
[Выделить все]
acadDoc.GetVariable('CMDACTIVE')
то она срабатывает только если перед этим уже завершена отрисовка линии. Иначе, если пользователь не указал первую и последнюю точку линии, возникает ошибка "Вызов был отклонен".
Да и возвращает тип Variant (у меня получалось вернуть лишь unassigned). В общем, пока что застрял на этом.

P.S.: Использовал тот код, что ты мне привел во 2 посте, та же ошибка "Вызов был отклонен".
dxaritonov вне форума  
 
Непрочитано 23.04.2010, 15:37
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


1. Команда _LINE может создать не один, а несколько отрезков. Так что ID будет несколько.
2. Можно создать свои реакторы (реакция на события) на завершение команды, на добавления объекта в базу AutoCAD, так что можно обойтись без пустого цикла.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.04.2010, 15:40
#7
dxaritonov


 
Регистрация: 23.04.2010
Сообщений: 7


1. _Line для примера взял. Но учту, спасибо
2. Если использовать реакторы, то необходимо импортировать tlb, что очень бы не хотелось, так как привязываемся к версии. Или я ошибаюсь? И можно обойтись простыми Variant-ами?
dxaritonov вне форума  
 
Непрочитано 23.04.2010, 15:54
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от dxaritonov Посмотреть сообщение
2. Если использовать реакторы, то необходимо импортировать tlb, что очень бы не хотелось, так как привязываемся к версии. Или я ошибаюсь? И можно обойтись простыми Variant-ами?
Боюсь, что без tlb не обойтись. Привязка к версии довольно условная, т.к. COM-интерфейс у AutoCAD меняется редко.

Цитата:
Сообщение от dxaritonov Посмотреть сообщение
Иначе, если пользователь не указал первую и последнюю точку линии, возникает ошибка "Вызов был отклонен".
А вот с этим нужно бороться проверкой состояния AutoCAD перед тем как к нему обращаться. Для этого есть метод: Application.GetAcadState. Если результат вызова IsQuiescent, то можно к нему обратиться, в противном случае он занят.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Получение идентификатора последнего введенного объекта

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение разрешения на строительство объекта капитального строительства maxummm Прочее. Архитектура и строительство 18 25.08.2010 20:31
Получение objectid объекта-текста и подставление его в формулу ilya_sp Программирование 7 11.02.2010 14:43