2 Это называет AcEdJig::sampler() функцией. Sampler() функция устанавливает список ключевого слова (если любой) с запросом к AcEdJig::setKeywordList() функция, специальный тип курсора (если желательно) с запросом к
AcEdJig:: setSpecialCursorType () функция, и любой пользователь вводит средство управления с запросом к AcEdJig:: setUserInputControls () функция. Затем, это называет один из acquireXXX () функциями, чтобы получить геометрическое значение (угол, расстояние, или пункт{*точка*}). Функция всегда возвращает немедленно после опроса текущую позицию устройства управления позицией.
3 Ваша sampler() функция должна выяснить, если имеется любое изменение{*замена*} в геометрическом дискретном значении. Если не имеется никакого изменения{*замены*}, ваш sampler () функция должна возвратить kNoChange и возвращаться, чтобы шагнуть. Это позволит изображению{*образу*} завершать его последнюю{*прошлую*} модификацию на экране. Это особенно важно для изображений{*образов*}, содержащих кривые.
4, даже если геометрическое значение дискретный изменилось, ваш sampler() функция может возвращать kNoChange (так, чтобы изображение{*образ*} не было модифицировано) и возвращение, чтобы шагнуть.
Если дискретное значение изменилось, и изображение{*образ*} должно быть модифицировано, перейдите шагать.
5 dragger называет AcEdJig::update () функцией, используя приобретенное геометрическое значение, чтобы модифицировать объект.
6 dragger тогда называет AcEdJig::entity() функцией, проходящей в указателе, который будет установлен в адрес объекта, который будет восстановлен. Затем, dragger называет worldDraw () функцией на объекте, чтобы восстановить это.
7 Возвращения, чтобы шагнуть, если поток{*ток*} dragger случай не был сгенерирован, выбирая с устройством управления позицией, нажимая ОТМЕНУ, или издавая строковый символ завершения, чтобы закончить перемещение.
Следующая блок-схема показывает эти шаги.

Реализация sampler(), update(), и entity()
В пределах samler() Вы должны установить некоторые параметры для перетащенной последовательности: список ключевого слова, подсказка дисплея, тип курсора, и пользователь вводит средство управления. Следующие разделы описывают каждый из этих параметров более подробно.
Список Ключевого слова
Если Вы имеете ключевые слова, которые являются значимыми в перетащенной последовательности, используют следующую функцию, чтобы определить их:
void
AcEdJig::setKeywordList(const char* kyWdList);
Список ключевого слова - одиночная строка, в которой каждое ключевое слово отделено от другие пробелами. Требуемые символы напечатаны прописными буквами, и остаток от каждого ключевого слова - нижний регистр.
Например, “Close Undo ”, определяет два ключевых слова. DragStatus перечислимые партнеры оценивают с каждым ключевым словом. Первое ключевое слово - kKW1, второй - kKW2, и так далее. Когда Вы осуществляете ваш AcEdJig класс, Вы можете использовать эти возвращаемые значения в ваших выполнении sampler(), update(), и entity() функции.
Подсказка Дисплея
Подсказка дисплея - текст, показанный на командной строке в течение перетащенной последовательности. Используйте следующую функцию, чтобы установить подсказку дисплея:
void
AcEdJig::setDispPrompt(const char* prompt);
Типы Курсора
Если Вы хотите установить специальный тип курсора, используйте следующую функцию:
void
AcEdJig::setSpecialCursorType(AcEdJig::CursorType);
CursorType может быть одно из значений в следующей таблице:
Курсор | Описание |
KCrosshair | Перекрестия, выровненные с системой координат пользователя (ВЕРХНИЕ РЕГИСТРЫ) |
kRectCursor | Прямоугольный курсор окна, выровненный с системой координат дисплея |
KRubberBand | Тот же самый как kCrosshair, кроме также отображает резиновую полосу от арифметической запятой |
kTargetBox | OSNAP курсор; подобный kEntitySelect курсору, кроме его размера управляется переменной системы $APERTURE |
kCrosshairNoRotate | Перекрестия, выровненные с системой координат дисплея |
KInvisible | Никакая графика курсора; только графика объекта отображена |
kEntitySelect | Одиночное поле указки объекта; объект фактически не выбран в этом случае{*регистре*}. Выбор Примитива обработан с acedSSGet () |
KParallelogram | Прямоугольник, выровненный с ВЕРХНИМИ РЕГИСТРАМИ (может быть параллелограмм на дисплее) |
kEntitySelectNoPersp | Тот же самый как kEntitySelect, кроме поля указки подавлен в перспективном представлении{*виде*}; использованный, когда точный геометрический пункт{*точка*} необходим наряду с выбранным объектом |
KPkfirstOrGrips | Заданный по умолчанию курсор; что курсор напоминает “между” командами |
kArrow | Отображает курсор стрелки, используемый для диалоговых окон в AutoCAD |
Этот шаг необязательный. AcquirePoint () функции позволяют Вам определять этот дополнительный курсор. При установке типа курсора для acquireDist () и acquireAngle () функции не имеют никакого эффекта. AcquireXXX () функции выберут курсор для Вас, если Вы явно не определяете тот.
Средство управления Ввода Пользователя
Используйте следующую функцию, чтобы изменить средство управления ввода гипотетического пользователя:
void setUserInputControls(AcEdJig::UserInputControls uic);
Ввод пользователя управляет помещенными ограничениями на перетащенную последовательность или тип приемлемого возвращаемого значения (например, не позволяя отрицательные ответы, не позволяя нулевой ответ, или, ограничивая входное значение к двумерной координате).
Они также определяют, как различные действия пользователя затрагивают перетащенную последовательность.
Например, kAcceptMouseUpAsPoint определяет, что выпуск кнопки мыши указывает входное значение.
Средство управления ввода пользователя может быть одно из следующих значений:
§ kGovernedByOrthoMode
§ kNullResponseAccepted
§ kDontEchoCancelForCtrlC
§ kDontUpdateLastPoint
§ kNoDwgLimitsChecking
§ kNoZeroResponseAccepted
§ kNoNegativeResponseAccepted
§ kAccept3dCoordinates
§ kAcceptMouseUpAsPoint
§ kAnyBlankTerminatesInput
§ kInitialBlankTerminatesInput
Как только Вы установили список ключевого слова, тип курсора, и средство управления ввода пользователя, ваш sampler() функция должна вызвать одну из следующих функций AcEdJig, чтобы получить угол, расстояние, или точку:
DragStatus
AcEdJig::acquireAngle(double &ang);
DragStatus
AcEdJig::acquireAngle(
double &ang,
const AcGePoint3d &basePt);
DragStatus
AcEdJig::acquireDist(double &dist);
DragStatus
AcEdJig::acquireDist(
double &dist,
const AcGePoint3d &basePt);
DragStatus
AcEdJig::acquirePoint(AcGePoint3d &point);
DragStatus
AcEdJig::acquirePoint(
AcGePoint3d &point,
const AcGePoint3d &basePt);
После вызова sampler() функция, Вы можете исполнять любой дальнейший анализ на полученном геометрическом значении и перетаскивать состояние. Вы будете также хотеть кэшировать возвращаемое значение в статической переменной для доступа в вашей update() или entity() функции.
§ update() функция - типично, где Вы изменяете объект, обычно, применяя преобразование к исходному объекту.
§ entity() функция возвращает указатель на объект, который будет восстановлен.
Добавление Примитива к Базе данных
Когда объект был полностью модифицирован, и перетащенная последовательность закончилась, использование, AcEdJig::append() функцию, чтобы прибавить объект к текущему пространственному блочному отчету{*записи*} таблицы. (Вы можете также использовать стандартные функции для добавления в конец объекта к блочному отчету{*записи*} таблицы.)
Типовой Код
Этот пример создает класс, который дает возможность пользователю создать эллипс, выбирая его среднюю точку и затем перемещая, чтобы выбрать желательную главную ось и незначительные{*младшие*} длины оси. В течение перетащенных операций, пользователь будет способен видеть то, что эллипс напоминает в любое время.
ОБРАТИТЕ ВНИМАНИЕ, пробует ли пользователь делать незначительную{*младшую*} ось дольше чем главная ось, эллипс закончится как круг, потому что отношение{*коэффициент*} радиуса не может быть большее чем 1.0.
class AsdkEllipseJig : public AcEdJig
// This class allows the user to create an ellipse by
// picking its center point and then dragging to select the
// desired major axis and minor axis lengths. During the
// drag operations, the user will be able to visually see
// what the ellipse looks like at any time.
//
{
public:
AsdkEllipseJig(const AcGePoint3d&, const AcGeVector3d&);
void doIt();
virtual DragStatus sampler();
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
private:
AcDbEllipse *mpEllipse;
AcGePoint3d mCenterPt, mAxisPt;
AcGeVector3d mMajorAxis, mNormal;
double mRadiusRatio;
int mPromptCounter;
};
// The following defines the constructor that accepts a point to be
// used as the centerpoint of the ellipse and the current UCS normal
// vector to be used as the normal for the ellipse. It also
// initializes the radius ratio to a small value so that during
// selection of the major axis, the ellipse will appear as a line.
// The prompt counter is also initialized to 0.
//
AsdkEllipseJig::AsdkEllipseJig(
const AcGePoint3d& pt,
const AcGeVector3d& normal)
: mCenterPt(pt),
mNormal(normal),
mRadiusRatio(0.00001),
mPromptCounter(0)
{ }
// This function creates an AcDbEllipse object and gets the
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


