{

return es;

}

} else if (ent->isKindOf(AcDb3dPolyline::desc())) {

if ((es = intPline(this, AcDb3dPolyline::cast(ent),

intType, &projPlane, points)) != Acad::eOk)

{

return es;

}

} else {

AcGePoint3dArray vertexArray;

if ((es = getVertices3d(vertexArray))

!= Acad::eOk)

{

return es;

}

if (intType == AcDb::kExtendArg

|| intType == AcDb::kExtendBoth)

{

intType = AcDb::kExtendThis;

}

AcDbLine *pAcadLine;

for (int i = 0; i < vertexArray. length() - 1; i++) {

pAcadLine = new AcDbLine();

pAcadLine->setStartPoint(vertexArray[i]);

pAcadLine->setEndPoint(vertexArray[i + 1]);

pAcadLine->setNormal(normal());

if ((es = ent->intersectWith(pAcadLine, intType,

projPlane, points)) != Acad::eOk)

{

delete pAcadLine;

return es;

}

delete pAcadLine;

}

// All the points that we selected in this process are on

// the other curve; we are dealing with apparent

// intersection. If the other curve is 3D or is not

// on the same plane as poly, the points are not on

// poly.

//

// In this case, we need to do some more work. Project the

// points back onto the plane. They should lie on

// the projected poly. Find points on real poly

// corresponding to the projected points.

//

AcGePoint3d projPt, planePt;

AcGePoint3dArray pts;

AcGeLine3d line;

AcGePlane polyPlane;

AcDb::Planarity plnrty;

getPlane(polyPlane, plnrty);

for (i = 0; i < points. length(); i++) {

// Define a line starting from the projPt and

// along the normal. Intersect the polygon with

НЕ нашли? Не то? Что вы ищете?

// that line. Find all the points and pick the

// one closest to the given point.

//

projPt = points[i].orthoProject(projPlane);

line. set(projPt, projPlane. normal());

if ((es = intLine(this, line, pts))

!= Acad::eOk)

{

return es;

}

planePt = projPt. project(polyPlane,

projPlane. normal());

points[i] = pts[0];

double length = (planePt - pts[0]).length();

double length2;

for (int j = 1; j < pts. length(); j++) {

if ((length2 = (planePt - pts[j]).length())

< length)

{

points[i] = pts[j];

length = length2;

}

}

}

}

return es;

}

Пересечение Заказного Примитива с Другим Примитивом

ObjectARX - открытая архитектура, где множественные приложения могут осуществлять их собственные заказные объекты. Возможно, что множественные приложения будут загружены в то же самое время в сеансе AutoCAD. Пользователь мог бы выбирать ваш заказной объект в операции, которая заставляет это пересекаться с другим заказным объектом, который Вы не знаете. Следующие рекомендации должны помочь Вам осуществить intersectWith () функция вашего заказного объекта.

§  Каждый заказной объект, как ожидается, будет способным пересечься с родными объектами. Родные объекты - объекты, определенные в AutoCAD, например, AcDbLine, AcDbEllipse, и AcDbSpline.

§  если intersectWith () функция вашего заказного объекта называется с другим объектом, который - не родной объект, Вы должны взорвать ваш заказной объект (например, используя взрывающийся () функция) к набору распознаваемых родных объектов, затем поворачивать вокруг и вызывать{*называть*} intersectWith () на объекте, который вошел как параметр к вашему intersectWith () в функцию. Поскольку каждый, как ожидается, будет способным пересечься с родными объектами, объект в параметре был бы способен пересечься с вашей вырезанной версией.

В течение этого процесса, Вы должны быть внимательным относительно того, как Вы называете intersectWith () функцией параметра и как Вы интерпретируете пункты{*точки*}, которые являются результатами пересечения. Например, если бы перекрестный тип был kExtendArg, Вы хотели бы изменить{*заменить*} это к kExtendThis перед запросом intersectWith () на параметре. Точно так же, если пересечение - очевидное пересечение на плоскости проектирования, пункты{*точки*}, возвращенные от intersectWith () обращаются к объекту параметра, будет на объекте параметра, не обязательно на вашем объекте. Вы, как предполагается, возвращаете перекрестные пункты{*точки*} на вашем объекте; поэтому, Вы должны проектировать пункты{*точки*} назад на плоскость проектирования (где они будут лежать на вашем проектируемом объекте) и затем проектировать их назад на ваш объект перед возвращением.

Взрыв Примитива

Вы должен перегрузить explode() функция заказного объекта для AutoCAD командует BHATCH и EXPLODE, чтобы работать. Ваш, чтобы explode () функция должна сломать объект в менее комплексные объекты. Если заканчивающиеся объекты - не, родные объекты, ваша функция должны возвратить eExplodeAgain.

Это заставит BHATCH рекурсивно называть explode() функцию на объектах, которые Вы возвращаетесь, пока они не были сокращены к родным объектам. Родные объекты, на которые BHATCH может работать непосредственно - AcDb2dPolyline, AcDb3dPolyline, AcDbPolyline, AcDbText, AcDbMText, AcDbShape, AcDbTrace, AcDbSolid, AcDbFace, AcDbViewport, AcDbFcf, AcDbDimension, AcDbRegion, AcDbBlockReference, и AcDbHatch.

Расширение Функциональных возможностей Примитива

ObjectARX расширение протокола - гибкий механизм, который может использоваться, чтобы прибавить функциональные возможности к существующим классам ObjectARX во время выполнения. Расширение Протокола позволяет Вам прибавлять функции к существующему классу без того, чтобы переопределить класс и перетранслировать приложение. (См. главу 19, “ Расширение Протокола. ”)

AcDbEntity класс связан с заданным по умолчанию классом расширения протокола, чтобы обеспечить поддержку базового класса для команды MATCHPROP. Заданный по умолчанию класс расширения протокола позволяет Вам копировать цвет, уровень, linetype, и свойства масштаба linetype от одного объекта до другого. Рекомендуется, чтобы AcDbMatchProperties был осуществлены как класс расширения протокола для всех заказных объектов, полученных из AcDbEntity, обеспечивать полную поддержку для MATCHPROP. Если заданный по умолчанию класс расширения протокола перегружен с AcDbMatchProperties, это должно включить функции, чтобы копировать свойства базового класса также.

Использование AcEdJig

AcEdJig класс используется, чтобы исполнить, перемещаются{*перетаскивают*} последовательности, обычно приобретать, создавать, редактировать, и прибавлять новый объект к базе данных. Если Вы получаете новый класс объекта, Вы будете обычно хотеть осуществить вашу собственную версию AcEdJig. Этот класс дает возможность пользователю AutoCAD определить некоторые аспекты объекта, используя устройство управления позицией, и это дает программисту, обращаются к AutoCAD, перемещаются{*перетаскивают*} механизм. (Класс берет его название{*имя*} от “ монтажное приспособление, ” устройство имел обыкновение проводить{*держать*} машинную часть, которая изгибается{*склоняется*} или molded на месте)

Каждый раз пользователь перемещает устройство управления позицией, ваше приложение приобретает геометрическое значение, и Вы должны обеспечить графическую обратную связь для случая устройства управления позицией. Эта обратная связь состоит из двух элементов:

§  курсор указанного типа

§  графика Примитива, возвращенная вашим объектом AcEdJig

AcEdJig вообще используется на объектах, которые не постоянно находятся в базе данных. Это работает на одиночном объекте. Не используйте AcEdJig, чтобы работать на комплексных объектах типа ломаных линий.

Наследование Нового Класса от AcEdJig

Чтобы осуществлять перетащенную последовательность для вашего нового объекта, Вы должны получить новый класс из AcEdJig и перегружать следующие функции элемента:

§  AcEdJig:: дискретизатор (), который приобретает геометрическое значение (угол, расстояние, или пункт{*точка*})

§  AcEdJig:: модификация (), который анализирует, геометрическое значение и сохраняет это или модифицирует объект

§  AcEdJig:: объект (), который возвращает указатель на объект, который будет восстановлен

Общие Шаги для Использования AcEdJig

AcEdJig разработан{*предназначен*}, чтобы управлять перетащенной последовательностью, поставляя{*снабжая*} графической обратной связи, указанной типом курсора и одиночным объектом.

Использовать AcEdJig класс

1 Создают образец вашего полученного класса AcEdJig.

2 Устанавливают ваш текст подсказки с AcEdJig:: setDispPrompt () функция.

3 Звонят, AcEdJig:: перетаскивают () функцию, которая управляет перетащенным циклом и в свою очередь вызывает{*называет*} дискретизатор (), модифицируйте (), и объект () функции, пока пользователь не заканчивает перетащенную последовательность.

4 Проверка в пределах дискретизатора () функция:

Если Вы используете подсказку с ключевыми словами, вызовите AcEdJig:: setKeywordList () функция.

Если Вы хотите установить специальный тип курсора, назовите AcEdJig:: setSpecialCursorType () функцией (. Этот шаг необязательный и может типично опускаться.)

Если желательно, ограничения места на перетащенную последовательность и возвращаемое значение, использующее AcEdJig:: setUserInputControls () функция.

5 Проверяют{*отмечают*} состояние возвращения от AcEdJig::, перемещается{*перетаскивает*} () функцию и передает{*совершает*} изменения{*замены*} перетащенной последовательности. Если пользователь отменил или прервал процесс, исполнять соответствующую очистку.

Установка Параметров для Перетащенной Последовательности

Прежде, чем Вы звоните, AcEdJig:: перетаскивают () функцию, Вы должны установить подсказку дисплея для перетащенной последовательности.

Подсказка дисплея - текст, показанный на командной строке в течение перетащенной последовательности. Используйте следующую функцию, чтобы установить подсказку дисплея:

void AcEdJig::setDispPrompt(const char* prompt);

Цикл перетаскивания

После того, как Вы установили подсказку дисплея для перетащенной последовательности, Вы звоните, AcEdJig::drag() функцию, которая исполняет перетащенный цикл, пока прессы пользователя НЕ ВВОДЯТ или клавиша "пробел", или указки с устройством управления позицией. Следующий список описывает последовательность перетащенного цикла:

1 перетащенный цикл получает случай.

Из за большого объема этот материал размещен на нескольких страницах:
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