int getAllSymbolRecordsIds(AcRxClass* pTableClass, AcDbObjectIdArray & idaAll) { CLogger::Print(_T("*Call: getAllSymbolRecordsIds()")); Acad::ErrorStatus es; idaAll.setLogicalLength(0); AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase(); AcDbSymbolTable* pSymbolTable = NULL; if (AcRx::kEqual == pTableClass->comparedTo(AcDbBlockTable::desc())) { CLogger::Print(_T("> This is BlockTable!")); es = pDb->getBlockTable(pSymbolTable, AcDb::kForRead); } else if (AcRx::kEqual == pTableClass->comparedTo(AcDbLayerTable::desc())) { CLogger::Print(_T("> This is LayerTable!")); es = pDb->getLayerTable(pSymbolTable, AcDb::kForRead); } else if (AcRx::kEqual == pTableClass->comparedTo(AcDbLinetypeTable::desc())) { CLogger::Print(_T("> This is LinetypeTable!")); es = pDb->getLinetypeTable(pSymbolTable, AcDb::kForRead); } else if (AcRx::kEqual == pTableClass->comparedTo(AcDbTextStyleTable::desc())) { CLogger::Print(_T("> This is TextStyleTable!")); es = pDb->getTextStyleTable(pSymbolTable, AcDb::kForRead); } else { CLogger::Print(_T("*Exit: getAllSymbolRecordsIds() - This kind of SymbolTable is not supported!")); return -1; } if (Acad::eOk != es) { CLogger::Print(_T("*Exit: getAllSymbolRecordsIds() - Fail to get SymbolTable!")); return -1; } //------------ // Get the SymbolTable's iterator. AcDbSymbolTableIterator* pSymbolTableIter = NULL; es = pSymbolTable->newIterator(pSymbolTableIter); pSymbolTable->close(); if (Acad::eOk != es) { CLogger::Print(_T("*Exit: getAllSymbolRecordsIds() - Fail to get the SymbolTable's iterator!")); return -1; } //------------ // Steps through the SymbolTable's records. // Then get the SymbolTableRecord's ObjectID. for (; !pSymbolTableIter->done(); pSymbolTableIter->step()) { AcDbObjectId idObj = AcDbObjectId::kNull; if (Acad::eOk == pSymbolTableIter->getRecordId(idObj)) idaAll.append(idObj); } delete pSymbolTableIter; CLogger::Print(_T("*Exit: getAllSymbolRecordsIds() - Count: %02d"), idaAll.length()); return idaAll.length(); }
//OPM calls this function for each property to obtain a list of strings and cookies if they are available. //For our textstyle property we would like to display all the textstyles currently available in the database. //This function is declared on the IPerPropertyBrowsing interface. Our IOPMPropertyExtensionImpl //class implements this member by reading the values in the OPM property map. (You set this up in your //head file when you use BEGIN_OPMPROP_MAP, OPMPROP_ENTRY, END_OPMPROP_MAP macros.) //Since we need a dynamic list of entries in this drop down list and a static map cannot implement this, //we need to override this function a provide dynamic list of text styles to OPM. STDMETHODIMP CComPolygon::GetPredefinedStrings(DISPID dispID, CALPOLESTR *pCaStringsOut, CADWORD *pCaCookiesOut) { if (dispID != DISPID_TEXTSTYLENAME) return IOPMPropertyExtensionImpl<CComPolygon>::GetPredefinedStrings(dispID,pCaStringsOut,pCaCookiesOut); USES_CONVERSION; AcDbTextStyleTable* pTT; AcDbDatabase *pDb = m_objRef.objectId().database(); if (NULL == pDb) pDb = acdbHostApplicationServices()->workingDatabase(); if (pDb->getTextStyleTable(pTT,AcDb::kForRead)==Acad::eOk) { AcDbTextStyleTableIterator* pIter; if (pTT->newIterator(pIter)==Acad::eOk) { long size = 0; // Clear the array. mObjectIdArray.removeAll(); for (pIter->start();!pIter->done();pIter->step()) size++; pCaStringsOut->pElems = (LPOLESTR *)::CoTaskMemAlloc(sizeof(LPOLESTR) * size); pCaCookiesOut->pElems = (DWORD *)::CoTaskMemAlloc(sizeof(DWORD) * size); long i=0; for (pIter->start();!pIter->done();pIter->step()) { AcDbTextStyleTableRecord* pTTR; if (pIter->getRecord(pTTR,AcDb::kForRead)!=Acad::eOk) continue; const TCHAR* pName = NULL; if (pTTR->getName(pName)==Acad::eOk){ //we want to show the name of the textstyle as //it appears in the database pCaStringsOut->pElems[i] = ::SysAllocString(CT2W(pName)); pCaCookiesOut->pElems[i] = mObjectIdArray.append(pTTR->objectId()); } pTTR->close(); i++; } pCaStringsOut->cElems = i; pCaCookiesOut->cElems = i; } if (pIter) delete pIter; pTT->close(); } return S_OK; }