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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > (ObjectARX) Вызов стандартной процедуры отрисовки полилинии пользователем

(ObjectARX) Вызов стандартной процедуры отрисовки полилинии пользователем

Ответ
Поиск в этой теме
Непрочитано 27.06.2010, 14:49 #1
(ObjectARX) Вызов стандартной процедуры отрисовки полилинии пользователем
lene-caress
 
Регистрация: 27.06.2010
Сообщений: 6

добрый день

пишу на C++ (не managed, не дотнет) под Autocad 2008 с соотв. версией ObjectARX

необходимо вызвать стандартную процедуру отрисовки полилинии
с помощью пользовательского интерфейса.
(ТЕ то, что происходит по комманде "pline")
после этого получить доступ к созданному объекту

как можно это реализовать?


варинат с получением точек через acedGetPoint
не устраивает, ТК необходимы и все остальные функции,
доступные при отрисовке: Arc, Close, Width и другие.

логика подсказывает, что должно быть возможно вызвать то,
что уже реализовано в AutoCAD, вместо написания своего велосипеда.

однако я не нашла никаких зацепок
подскажите пожалуйста, куда копать?


заранее спасибо. удачи
Просмотров: 4009
 
Непрочитано 27.06.2010, 15:49
#2
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


Используй acdbEntGet, acdbEntLast, acedCommand с опцией pause. Как их использовать см. интернет и справку.
nikе вне форума  
 
Автор темы   Непрочитано 27.06.2010, 21:30
#3
lene-caress


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


использую:
Код:
[Выделить все]
acedCommand( RTSTR, _T( "_pline" ), RTSTR, PAUSE, RTNONE )
управление моей функции возвращается не после отрисовки всей линии,
а после первого ввода пользователя.

встал вопрос - как дождаться конца всей отрисовки?

нашла в инете вариант с проверкой переменной CMDACTIVE,
но поскольку я вызываю acedCommand из комманды - CMDACTIVE уже == 1,
а значит ценной для меня информации не несет.


решила попробовать SendStringToExecute,
однако эта функция заносит комманду _pline в историю комманд
это очень нежелательный эффект - если нажать ENTER
по окончании отрисовки будет вызвана не моя комманда, а _pline


сейчас думаю копать в сторону
AcEditorReactor::commandEnded()
стОит?

---------------------------------------------------------------------
добавлено позже:

ой... кажится что-то получилось...
(sorry, код хуже индусячего - эксперементировала)
выглядит примерно так:

Код:
[Выделить все]
struct resbuf rb;
acedGetVar(_T("CMDNAMES"), &rb);
CString cmd_ok( rb.resval.rstring );

if ( acedCommand( RTSTR, _T( "_pline" ), RTSTR, PAUSE, RTNONE ) == RTNORM )
	{
	while( true )
		{
		acedGetVar(_T("CMDNAMES"), &rb);
		CString cmd_now( rb.resval.rstring );
		if ( cmd_ok != cmd_now )
			{
			acedCommand(RTSTR, PAUSE, 0);
			}
		else break;
		}
	
	ads_name ent;
	AcDbObjectId id = AcDbObjectId::kNull;
	if (acdbEntLast(ent) == RTNORM)
		{
		if (acdbGetObjectId(id,ent) == Acad::eOk)
			{
			AcDbObject *acobj = NULL;
			if ( acdbOpenObject( acobj, id, AcDb::kForWrite ) == Acad::eOk )
				{
				AcDbPolyline *pline = AcDbPolyline::cast( acobj );
				if ( pline )
					{
					pline->erase(); // удаляем для проверки
					pline->close();
					}
				acobj->close();
				}
			}
		}
	}
это работает и даже не падает.

однако это кажется какимто очень кривым, с точки зрения идеологии.

может я чтото не заметила и есть вариант лучше?

Последний раз редактировалось lene-caress, 27.06.2010 в 21:38.
lene-caress вне форума  
 
Непрочитано 27.06.2010, 23:53
#4
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


Не криво, а по Лисповски :
(command "_.dimlinear")
(while (= (logand (getvar "CMDACTIVE") 1) 1)
(command pause)

)
по-другому не сделаешь.
nikе вне форума  
 
Автор темы   Непрочитано 11.07.2010, 21:16
#5
lene-caress


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


здравствуйте еще раз!

прошу прощения за поднятие топика.
возникло продолжение проблемы.

код который я писала выше, выполнялся по комманде в коммандной строке.
сейчас требуется выполнить тоже-самое но только по кнопочке в CAdUiPalette.

при использовании того-же кода в обработчике нажания на кнопку
acedCommand не срабатывает.

для контроля использую более простую комманду:
acedCommand( RTSTR, _T( "_zoom" ), RTSTR, _T( "_e" ), 0 );
с ней ситуация аналогичная - в первом случае работает, во втором - нет.

как я поняла, первый случай (коммандная строка) выполняется в контексте документа.
а при нажатии на кнопку в CAdUiPalette код выполняется в контексте приложения.
это и является причиной проблемы.

в первом случае acDocManager->isApplicationContext() говорит false, во втором true.

в обоих случаях acDocManager->curDocument()->fileName() сообщает имя необходимого документа.

пробовала найти способ переключить конекст...

так:
acDocManager->setCurDocument( acDocManager->curDocument(), AcAp::kNone, true );

или так:
acDocManager->activateDocument( acDocManager->curDocument(), false );

пробовала блокировать документ:
acDocManager->lockDocument( acDocManager->curDocument() );
acedCommand( RTSTR, _T( "_zoom" ), RTSTR, _T( "_e" ), 0 );
acDocManager->unlockDocument( acDocManager->curDocument() );

результат одинаоковый - абсолютно ничего.

возникает вопрос - как всетаки вызвать стандартную операцию отрисовки полилинии
из контекста приложения?

есть какой-то правильный способ переключить контекст?

есть мысль, что можно получить нужную структуру AcEdCommandStruc,
описывающую нужную функцию через acedCmdLookup.
стоит ли пробовать?

по идее должна работать:
acDocManager->sendStringToExecute( acDocManager->curDocument(), ...
но при её использовании в истории комманд остается введенная,
а это крайне нежелательный эффект

или есть другой способ вызова процедуры отрисовки??
(логика подсказывает, что нечто подобное должно быть возможно, минуя коммандную систему)
lene-caress вне форума  
 
Непрочитано 13.07.2010, 08:24
#6
Александр Ривилис

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


Цитата:
Сообщение от lene-caress Посмотреть сообщение

есть какой-то правильный способ переключить контекст?
Только через sendStringToExecute - реализуй свой код в виде команды и запускай его из панели при помощи sendStringToExecute

Цитата:
Сообщение от lene-caress Посмотреть сообщение
есть мысль, что можно получить нужную структуру AcEdCommandStruc,
описывающую нужную функцию через acedCmdLookup.
стоит ли пробовать?
Мысль неправильная, т.к. PLINE - встроенная команда и в таблице команд не фигурирует.

Последний раз редактировалось Александр Ривилис, 15.07.2010 в 17:20.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > (ObjectARX) Вызов стандартной процедуры отрисовки полилинии пользователем

Опции темы Поиск в этой теме
Поиск в этой теме:

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