2.6.5.2.2. Реализация интерфейса IAcStPlugin2 и методы инициализации

Источник: "ObjectARX for AutoCAD 2010". [перевод не проверен];[перевёл Андрей Бушман]

    Следующие методы инициализируют плагин, и более того - реализация их обязательна:
  • Initialize              (Инициализация плагина)
  • SetupForAudit     (Запуск для аудита)
    Плагины должны использовать метод SetupForAudit() для подготовки любой информации, которая им понадобится в других методах при проверке чертежа. Параметры, передаваемые в этот метод определяют контекст, в котором будет выполняться плагин, включая проверяемый DWG-файл, и DWS-файлы необходимые для сопоставления информации при проверке.

    В методе SetupForAudit() плагин должен выполнить следующие действия:
  • Кэшировать1 в виде pDb интерфейса, точку доступа к чертежу, который будет проверяться.
  • Кэшировать1 из DWS файлов  любую информацию, необходимую для проверки чертежа.
    Следующий пример кода демонстрирует реализацию метода SetupForAudit(). Полный код этого примера доступен в подкаталоге samples\editor\CircleStandard основного каталога ObjectARX.

Код С++

 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
STDMETHODIMP
CAcStCircle::SetupForAudit(IAcadDatabase *pDb,
BSTR szPathName,
VARIANT vStdNameArray,
VARIANT vStdPathArray,
VARIANT vStdDbArray)
{
TRACE("CAcStCircle::SetupForAudit() called.\n");
Acad::ErrorStatus es;
long uBound1 = 0, uBound2 = 0, lBound1 = 0, lBound2 = 0;
SafeArrayGetLBound(vStdPathArray.parray, 1, &lBound1);
SafeArrayGetUBound(vStdPathArray.parray, 1, &uBound1);
SafeArrayGetLBound(vStdDbArray.parray, 1, &lBound2);
SafeArrayGetUBound(vStdDbArray.parray, 1, &uBound2);
// Они должны иметь тот же самый размер
ASSERT((lBound1 == lBound2) && (uBound1 == uBound2));
if ((lBound1 != lBound2) || (uBound1 != uBound2)) {
ASSERT(false);
return E_FAIL;
// Кэшируем* все окружности, готовые для проверки в текущем чертеже.
m_pComDwgDb = pDb;
getDatabase(pDb, &m_pDwgDb);
ASSERT(m_pDwgDb);
es = getObjectsOfType(m_pDwgDb, m_pDesc,
m_objIdsToCheck);
ASSERT(es==Acad::eOk);
// Выполняем итерацию в DWS файлах и кэшируем* все свойства (цвет и радиус) у стандартных окружностей.
for (long j = lBound1; j <= uBound1; j++)
{
// Получаем базу данных DWS файла.
CComPtr<IAcadDatabase> pStdDb = NULL;
getIUnknownElementFromSafeArray(&vStdDbArray, j,
&(pStdDb.p));
ASSERT(pStdDb != NULL);
AcDbDatabase *pDwsDb = NULL;
getDatabase(pStdDb, &pDwsDb);
ASSERT(pDwsDb);
// кэшируем* свойства (цвет и радиус) всех окружностей в базе данных DWS файла.
for(; !m_objIdsFix.isEmpty();
m_objIdsFix.removeLast()){}
m_objIdsFix.setLogicalLength(0);
es = getObjectsOfType(pDwsDb, m_pDesc, m_objIdsFix);
for(int i=0; i<m_objIdsFix.length(); i++)
{
AcDbEntity* pEnt = NULL;
AcDbCircle* pCir = NULL;
es = acdbOpenAcDbEntity(pEnt, m_objIdsFix[i],
AcDb::kForRead);
ASSERT(pEnt);
pCir = AcDbCircle::cast(pEnt);
ASSERT(pCir);
if( es == Acad::eOk )
{
circleCache cirCache;
cirCache.color = pCir->colorIndex();
cirCache.radius = pCir->radius();
pCir->close();
pCir = NULL;
getStringElementFromSafeArray(&vStdNameArray,
j, cirCache.standardFileName);
FixPointer pFix = NULL;
createNewFix(&pFix, CString("Color fix"),
cirCache.standardFileName);
CString str;
str.Format("color %d", cirCache.color);
pFix->put_FixObjectName(str.AllocSysString());
CComVariant var = cirCache.color;
pFix->PropertyValuePut(L"Color", var);
cirCache.pFix = pFix;
m_circleCacheArray.append(cirCache);
}
} // завершаем цикл для исправления объектов
pStdDb.Release();
} // завершаем цикл для DWS файлов базы данных
return S_OK;
}

Примечания переводчика:
1 - кешировать - значит хранить локальную копию. Под "локальной копией" подразумевается место, доступ в которое будет быстрее, чем туда где находится оригинал.


Comments