§ класс расширения Протокола
Указатель на класс, который исполняет обработку " в юридическое лицо " режима объектной привязки.
§ Глиф(Glyph)
Заказной глиф для режима объектной привязки.
§ ToolTip строка
По умолчанию ToolTip строка для заказного режима объектной привязки.
Для подробной информации относительно установки этих атрибутов, см. ObjectARX Ссылку.
Заказной режим объектной привязки определен, регистрируя образец AcDbCustomOsnapMode класса с заказным объектным менеджером привязок, описан в предыдущей секции.
Когда заказной режим объектной привязки используется, AutoCAD берет объект класса, возвращенный AcDbCustomOsnapMode:: entityOsnapClass (), взгляды соответствующий объект расширения протокола для выбранного примитива, и вызывает AcDbCustomOsnapInfo:: getOsnapInfo () чтобы получить точки или линии, связанные с тем примитивом и режимом объектной привязки. Если она кандидат, точка связана с тем режимом объектной привязки, AutoCAD, отображает объект глифа от образца, возвращенного AcDbCustomOsnapMode::gluph () и ToolTip строка, возвращенная AcDbCustomOsnapMode:: tooltipString ().
Создание Классов Расширения Протокола
Чтобы создавать заказной режим объектной привязки, Вы должны создать классы расширения протокола, чтобы обработать входную точку "в юридическое лицо" обработка. Класс AcDbCustomOsnapInfo определяет протокол, который каждый заказной режим объектной привязки должен осуществить для уместных примитивов. Этот базовый класс содержит функцию getOsnapInfo (), который исполняет входную обработку точки на примитиве:
class AcDbCustomOsnapInfo : public AcRxObject {
public:
ACRX_DECLARE_MEMBERS(AcDbCustomOsnapInfo);
virtual Acad::ErrorStatus
getOsnapInfo(
AcDbEntity* pickedObject,
int gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcArray<AcGePoint3d>& snapPoints,
AcArray<int>& geomIdsForPts,
AcArray<AcGeLine3d>& snapLines,
AcArray<int>& geomIdsForLines);
};
Создавать расширение протокола классифицирует для заказных режимов объектной привязки
1 Определяют абстрактный класс расширения протокола, полученный из AcDbCustomOsnapInfo.
Например, если ваш класс пользователя назван AcmeSocketInfo, определите это следующим образом:
class AcmeSocketInfo : public AcDbCustomOsnapInfo{
public:
ACRX_DECLARE_MEMBERS(AcDbSocketInfo);
virtual Acad::ErrorStatus
getOsnapInfo(
AcDbEntity* pickedObject,
int gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcArray<AcGePoint3d>& snapPoints,
AcArray<int>& geomIdsForPts,
AcArray<AcGeLine3d>& snapLines,
AcArray<int>& geomIdsForLines);
};
ACRX_NO_CONS_DEFINE_MEMBERS(AcmeSocketInfo, AcDbCustomOsnapInfo);
2 Инициализируют основной класс расширения протокола и добавляют это к иерархии классов во время выполнения.
Например, добавьте следующие линии к вашему acrxEntryPoint () функция:
AcmeSocketInfo::rxInit();
acrxBuildClassHierarchy();
3 Для каждого уместного класса примитива, получите класс расширения протокола из базового класса.
Например, Вы могли бы получать класс по имени AcmeSocketForLines, который осуществляет getOsnapInfo () чтобы обработать входную обработку точки для линий.
ОБРАТИТЕ ВНИМАНИЕ, что заданное по умолчанию выполнение должно быть связано с AcDbEntity для каждого зарегистрированного класса, полученного из AcDbCustomOsnapInfo.
4 Создают образец каждого объекта расширения протокола и добавляют объекты к соответствующим AcRxClass дескрипторным объектам, использующим addX () функция.
Например:
pSocketForLine = new AcmeSocketForLine;
AcDbLine::desc()->addX(AcmeSocketInfo::desc(), pSocketForLine);
Создание Заказного Глифа
Вы можете создавать заказной глиф происходящий от AcGiGlyph и регистрацию глифа с вашим заказным режимом объектной привязки. Две функции должны быть осуществлены в вашем полученном классе: setLocation() и viewportDraw(). SetLocation() функция заставляет местоположение глифа рисоваться, и viewportDraw() функция рисует глиф.
Имеются несколько требований для графики, используемой в viewportDraw () который должен соблюстись. Графика должна быть выровненная дисплеем, и на нее нельзя воздействовать ориентацией примитива, текущий UCS, или текущий вид преобразовывает. Дополнительно, графика должна масштабироваться, чтобы приспособить текущий Авто-привязка размер маркера, который может быть определен, используя функцию acdbCustomOsnapManager()>osnapGlyphSize().
ОБРАТИТЕ ВНИМАНИЕ, возвращаете ли Вы указатель NULL вместо заказного глифа, AutoCAD не будет рисовать никакой глиф для режима объектной привязки.
Пример заказного режима объектной привязки
Следующий пример демонстрирует создание заказных режимов объектной привязки:
#include "rxobject. h"
#include "ads. h"
#include "adslib. h"
#include "dbmain. h"
#include "dbents. h"
#include "dbosnap. h"
#include "acedinpt. h"
// Socket Osnap mode protocol extension class.
//
class AcmeSocketInfo : public AcDbCustomOsnapInfo {
public:
ACRX_DECLARE_MEMBERS(AcmeSocketInfo);
virtual Acad::ErrorStatus
getOsnapInfo(
AcDbEntity* pickedObject,
int gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcArray<AcGePoint3d>& snapPoints,
AcArray<int>& geomIdsForPts,
AcArray<AcGeCurve3d>& snapCurves,
AcArray<int>& geomIdsForLines)
};
// This class is registered with AcRx, to be used by the host
// application to look up entity class-specific implementations.
//
ACRX_NO_CONS_DEFINE_MEMBERS(AcmeSocketInfo, AcDbCustomOsnapInfo);
Acad::ErrorStatus
AcmeSocketInfo::getOsnapInfo(
AcDbEntity*,
int,
const AcGePoint3d&,
const AcGePoint3d&,
const AcGePoint3d&,
AcArray<AcGePoint3d>& snapPoints,
AcArray<int>& geomIdsForPts,
AcArray<AcGeCurve3d>& snapCurves,
AcArray<int>& geomIdsForLines)
{
// Associate with AcDbEntity to define default behavior.
//
snapPoints. setLogicalLength(0);
geomIdsForPts. setLogicalLength(0);
snapLiness. setLogicalLength(0);
geomIdsForLines. setLogicalLength(0);
}
// Socket Osnap mode protocol extension object for AcDbLine.
//
class AcmeSocketForLine : public AcmeSocketInfo {
public:
virtual Acad::ErrorStatus
getOsnapInfo(
AcDbEntity* pickedObject,
int gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcArray<AcGePoint3d>& snapPoints,
AcArray<int>& geomIdsForPts,
AcArray<AcGeCurve3d>& snapCurves,
AcArray<int>& geomIdsForLines)
};
Acad::ErrorStatus
AcmeSocketForLine::getOsnapInfo(
AcDbEntity* pickedObject,
int,
const AcGePoint3d& pickPoint,
const AcGePoint3d&,
const AcGeMatrix3d& viewXform,
AcArray<AcGePoint3d>& snapPoints,
AcArray<int>& geomIdsForPts,
AcArray<AcGeCurve3d>& snapCurves,
AcArray<int>& geomIdsForLines)
{
// Protocol extension ensures that the following assertion
// is always true, but check in non-production versions
// just to be safe.
//
ASSERT(pickedObject->isKindOf(AcDbLine::desc()));
// In production, a hard cast is fastest.
AcDbLine* lineEnt = (AcDbLine*)pickedObject;
// Do computation using AcDbLine protocol, pickPoint, and
// viewXform. For example, if you want to find the closest
// socket to the pick point and return just that, set
// snapPoints and geomIdsForPts accordingly.
// But this isn’t an AutoSnap mode...
//
snapLiness. setLogicalLength(0);
geomIdsForLines. setLogicalLength(0);
}
// Actual protocol extension objects
//
static AcmeSocketInfo* pDefaultSocketInfo = NULL;
static AcmeSocketForLine* pSocketForLine = NULL;
// "SOCket" Osnap mode glyph object
//
class AcmeSocketGlyph : public AcGiGlyph
{
public:
virtual Acad::ErrorStatus
setLocation(const AcGePoint3d& dcsPoint);
virtual void
viewportDraw(AcGiViewportDraw* vportDrawContext);
private:
AcGePoint3d mCurDcsLoc;
};
Acad::ErrorStatus
AcmeSocketGlyph::setLocation(const AcGePoint3d& dcsPoint)
{
mCurDCSLoc = dcsPoint;
}
// These variables are extremely transient, and are
// made static to save constructor/destructor cost.
static AcGePoint2d& sPixelArea;
AcArray<AcGePoint3d> sSegmentPoints[2];
void
AcmeSocketGlyph::viewportDraw(AcGiViewportDraw* vportDrawContext)
{
// Taking mCurDCSLoc, the pixel size, and the AutoSnap
// marker size into account, plus anything else, such as socket
// orientation, draw the glyph.
// If this ASSERT fails, then the pixel size is really position-
// dependent.
//
ASSERT(!vportDrawContext->viewport()->isPerspective());
vportDrawContext->viewport()->getNumPixelsInUnitSquare(AcGePoint3d::kOrigin, pixelArea);
double halfGlyphSizeInDCS =
acdbCustomOsnapManager->osnapGlyphSize() * pixelArea. x / 2.0;
// Draw an asterisk with 4 segments.
//
sSegmentPoints[0].set(
mCurDCSLoc. x-halfGlyphSizeInDCS,
mCurDCSLoc. y-halfGlyphSizeInDCS, 0.0);
sSegmentPoints[1].set(
mCurDCSLoc. x+halfGlyphSizeInDCS,
mCurDCSLoc. y+halfGlyphSizeInDCS, 0.0);
vportDrawContext->geometry().polylineDc( 2, &(sSegmentPoints[0]));
sSegmentPoints[0].set(
mCurDCSLoc. x-halfGlyphSizeInDCS,
mCurDCSLoc. y+halfGlyphSizeInDCS, 0.0);
sSegmentPoints[1].set(
mCurDCSLoc. x+halfGlyphSizeInDCS,
mCurDCSLoc. y-halfGlyphSizeInDCS, 0.0);
vportDrawContext->geometry().polylineDc( 2, &(sSegmentPoints[0]));
sSegmentPoints[0].set(
mCurDCSLoc. x-halfGlyphSizeInDCS,
mCurDCSLoc. y, 0.0);
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


