// 查找从根类型派生的图元 void ArxClassHelper::GetArxClassTypes( const CString& root, AcStringArray& types, bool findAbstractType ) { // 如果根类型不存在,默认为AcDbObject AcRxClass* pParentClass = AcRxClass::cast( acrxClassDictionary->at( root ) ); if( pParentClass == 0 ) pParentClass = AcDbObject::desc(); AcRxDictionaryIterator* iter = acrxClassDictionary->newIterator(); if( iter == 0 ) return; for( ; !iter->done(); iter->next() ) { AcRxClass* pClass; if( ( pClass = AcRxClass::cast( iter->object() ) ) != NULL ) { if( pClass->isDerivedFrom( pParentClass ) ) { const ACHAR* text = pClass->name(); if( text == NULL ) continue; if( !findAbstractType && ( pClass->dxfName() == NULL ) || ( pClass->appName() == NULL ) ) continue; //acutPrintf(_T("appName:%s\ndxfName:%s\nname:%s\n"), pClass->appName(), pClass->dxfName(), pClass->name()); types.append( text ); } } } delete iter; }
void DrawHelper::ConfigDraw( const CString& geType, const CString& drawName ) { MineGEDraw* pDraw = MineGEDrawSystem::GetInstance()->getGEDraw( geType, drawName ); if( pDraw == 0 ) return; // 该绘制效果不存在 pDraw->configExtraParams(); // 配置附加参数 AcDbObjectIdArray objIds; ArxDataTool::GetEntsByType( geType, objIds, false ); if( objIds.isEmpty() ) return; // dwg图形中没有任何geType类型图元 AcTransaction* pTrans = actrTransactionManager->startTransaction(); if( pTrans == 0 ) return; int len = objIds.length(); for( int i = 0; i < len; i++ ) { AcDbObject* pObj; if( Acad::eOk != pTrans->getObject( pObj, objIds.at( i ), AcDb::kForWrite ) ) continue; MineGE* pGE = MineGE::cast( pObj ); if( pGE == 0 ) continue; pGE->configDraw( pDraw->isA()->name() ); // 更新extra param pGE->recordGraphicsModified( true ); // 更新图形 } actrTransactionManager->endTransaction(); AcRxClass* pClass = AcRxClass::cast( acrxClassDictionary->at( geType ) ); if( pClass != 0 && pClass->isDerivedFrom( LinkedGE::desc() ) ) { UpdateLinkedGE( objIds ); } }
void DrawHelper::SwitchDraw( const CString& geType, const CString& drawName ) { // 设置当前可视化效果 if( !SetCurDraw( geType, drawName ) ) return; // 更新所有指定类型的图元 AcDbObjectIdArray objIds; ArxDataTool::GetEntsByType( geType, objIds, false ); if( objIds.isEmpty() ) return; // dwg图形中没有任何MineGE类型图元 // 将所有geType类型图元的绘制效果更新 AcTransaction* pTrans = actrTransactionManager->startTransaction(); if( pTrans == 0 ) return; int len = objIds.length(); for( int i = 0; i < len; i++ ) { AcDbObject* pObj; if( Acad::eOk != pTrans->getObject( pObj, objIds.at( i ), AcDb::kForWrite ) ) continue; MineGE* pGE = MineGE::cast( pObj ); if( pGE == 0 ) continue; pGE->updateDraw(); // 更细可视化效果指针 //pGE->recordGraphicsModified(true); // 更新图形 } actrTransactionManager->endTransaction(); AcRxClass* pClass = AcRxClass::cast( acrxClassDictionary->at( geType ) ); if( pClass != 0 && pClass->isDerivedFrom( LinkedGE::desc() ) ) { UpdateLinkedGE( objIds ); } }
void AecUiPrEntitySet::getAllowableClassTypes() { ASSERT(m_allowedClassTypes.length() == m_doIsATest.length()); m_classTypeCache = m_allowedClassTypes; // copy over all the definite classes that are ok AcRxDictionaryIterator* iter; AcRxDictionary* classDict = acrxClassDictionary; if (classDict == NULL) { AEC_ASSERT(0); return; } int len = m_doIsATest.length(); for (int i=0; i<len; i++) { // if not doing isA() testing, must get all classes derived from // this one. if (m_doIsATest[i] == Adesk::kFalse) { iter = classDict->newIterator(); if (iter != NULL) { // iterate over each item and get its info AcRxObject* classDictItem; AcRxClass* classObj; for (; !iter->done(); iter->next()) { classDictItem = iter->object(); if ((classObj = AcRxClass::cast(classDictItem)) != NULL) { if (classObj->isDerivedFrom(static_cast<AcRxClass*>(m_allowedClassTypes[i]))) { if (m_classTypeCache.contains(classObj) == Adesk::kFalse) { m_classTypeCache.append(classObj); } } } else { AEC_ASSERT(0); } } delete iter; } else { AEC_ASSERT(0); } } } }