void asdktest5 () { //----- Select the entities ads_name ss, en ; if ( acedSSGet (NULL, NULL, NULL, NULL, ss) != RTNORM ) return ; //----- Append entity IDs to the collector long n ; AcDbObjectId id ; AsdkHlrCollector collector ; acedSSLength (ss, &n) ; for ( int i =0 ; i < n ; i++ ) { acedSSName (ss, i, en) ; acdbGetObjectId (id, en) ; collector.addEntity (id) ; } acedSSFree (ss) ; //----- Display a dialog box to select HLR controls, the user wants to apply to the HLR engine AfxSetResourceHandle (_hdllInstance) ; CControlsDlg dlg ; dlg.mnControls =kProject | kEntity | kBlock | kHonorInternals ; if ( dlg.DoModal () != IDOK ) { AfxSetResourceHandle (acedGetAcadResourceInstance ()) ; return ; } AfxSetResourceHandle (acedGetAcadResourceInstance ()) ; int control =dlg.mnControls ; acutPrintf (ACRX_T("\nAbout to call hidden Line calculation")) ; acutPrintf (ACRX_T("\nCalling with %d Entities"), collector.getInputEntityIds ().logicalLength ()) ; acutPrintf (ACRX_T("\nkProject %s "), control & kProject ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkShowAll %s "), control & kShowAll ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkEntity %s "), control & kEntity ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkBlock %s "), control & kBlock ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkSubentity %s "), control & kSubentity ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkHideTangents %s "), control & kHideTangents ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkCleanup %s "), control & kCleanup ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkIsolines %s "), control & kIsolines ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkUnite %s "), control & kUnite ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkReuse %s "), control & kReuse ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkProgress %s "), control & kProgress ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkHandlePoints %s "), control & kHandlePoints ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkHonorInternals %s "), control & kHonorInternals ? ACRX_T("On") : ACRX_T("Off")) ; acutPrintf (ACRX_T("\nkMeshSilhouettes %s "), control & kMeshSilhouettes ? ACRX_T("On") : ACRX_T("Off")) ; //----- Ask for virtual viewport settings AcDbViewport *pVp =NULL ; if ( !pickViewport (pVp) ) return ; //----- Process hidden line removal AsdkHlrEngine hlr (pVp, control) ; hlr.run (collector) ; delete pVp ; //----- The following code will collect the color of the originator entity of an edge //----- and will assign it to the resulting entity. actrTransactionManager->startTransaction () ; int nOutput =collector.mOutputData.logicalLength () ; acutPrintf (ACRX_T("\nHlr returned %d curves"), nOutput) ; for ( int j =0 ; j < nOutput ; j++ ) { AsdkHlrData *pResult =collector.mOutputData [j] ; AcDbEntity *pResultEntity =pResult->getResultEntity () ; AcDbObjectId id ; if ( postToDatabase (NULL, pResultEntity, id) != Acad::eOk ) { acutPrintf (_T("Failed to add entity to current space.\n")) ; break ; } actrTransactionManager->getObject ((AcDbObject *&)pResultEntity, id, AcDb::kForWrite) ; AcDbObjectIdArray ids =pResult->getObjectIds () ; int last =ids.logicalLength () - 1 ; AcCmColor color ; AcDbObjectId layerId ; color.setColorIndex (0) ; while ( last >= 0 && color.colorIndex () == 0 ) { AcDbObjectId innerId =ids.at (last) ; AcDbObject *pObj ; actrTransactionManager->getObject (pObj, innerId, AcDb::kForRead) ; AcDbEntity *pEnt =AcDbEntity::cast (pObj) ; color =pEnt->color () ; layerId =pEnt->layerId () ; last-- ; } if ( layerId != AcDbObjectId::kNull ) { pResultEntity->setColor (color) ; pResultEntity->setLayer (layerId) ; } else { AcDbEntity *pEnt =pResult->getEntity () ; if ( pEnt != NULL ) { pResultEntity->setColor (pEnt->color ()) ; pResultEntity->setLayer (pEnt->layer ()) ; } } pResultEntity->close () ; } actrTransactionManager->endTransaction(); }
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 ); } }
static void UpdateEdge( const AcDbObjectIdArray& objIds ) { AcTransaction* pTrans = actrTransactionManager->startTransaction(); if( pTrans == 0 ) return; int n = objIds.length(); for( int i = 0; i < n; i++ ) { AcDbObjectId objId = objIds.at( i ); LinkedGE* pEdge = OpenEdge2( pTrans, objId, AcDb::kForWrite ); pEdge->recordGraphicsModified( true ); // 标签图形已经修改,需要更新图形 } actrTransactionManager->endTransaction(); }
void Additional_Class::Set_ObjectColor( AcDbObjectIdArray obIDArray, int ColorIndex ) { AcDbObjectId tempID; for (int i=0; i<obIDArray.length(); i++) { tempID = obIDArray.at(i); Set_ObjectColor(tempID, ColorIndex); } // //AcDbEntity *pEnt_Temp; //if (acdbOpenAcDbEntity(pEnt_Temp, ObID, AcDb::kForWrite) != Acad::eOk) //{ // acutPrintf(_T("\nOPEN ERROR")); // return; //} //pEnt_Temp->setColorIndex(ColorIndex); //pEnt_Temp->close(); return; }
static void BuildJunctionEdgeInfo( const AcDbObjectIdArray& objIds, const AcGePoint3d& junctionPt, EdgeInfo& ges ) { AcTransaction* pTrans = actrTransactionManager->startTransaction(); if( pTrans == 0 ) return; int n = objIds.length(); for( int i = 0; i < n; i++ ) { AcDbObjectId objId = objIds.at( i ); JunctionEdgeInfo info = {objId, true, AcGeVector3d::kIdentity}; LinkedGE* pEdge = OpenEdge2( pTrans, objId, AcDb::kForRead ); if( pEdge == 0 ) continue; AcGePoint3d startPt, endPt; pEdge->getSEPoint( startPt, endPt ); if( startPt == junctionPt ) { info.startOrEnd = true; info.angle = pEdge->getStartPointInExtendAngle(); } else if( endPt == junctionPt ) { info.startOrEnd = false; info.angle = pEdge->getEndPointInExtendAngle(); } if( info.angle.isZeroLength() ) continue; // 零向量表示不处理闭合 //acutPrintf(_T("\nid:%d\tangle:%.3f\tdraw:%s"), // info.objId, // info.angle.angleTo(AcGeVector3d::kXAxis, -AcGeVector3d::kZAxis), // pEdge->getCurrentDraw()); ges.push_back( info ); } actrTransactionManager->endTransaction(); }
//When an new entity is added, set its draw order based on the draw order of other entities on the same layer. void adskMyDbReactor::objectAppended(const AcDbDatabase* db, const AcDbObject* pObj) { AcDbEntity * pEnt = AcDbEntity::cast(pObj); Acad::ErrorStatus es; if (pEnt != NULL) { AcDbBlockTable *pBT = NULL; AcDbBlockTableRecord *pBTR = NULL; //use transaction since the datbase is still open for write here. es=actrTransactionManager->enableGraphicsFlush(true); AcTransaction *pTrans = actrTransactionManager->startTransaction() ; if(!pTrans) { acutPrintf("\nCan't start transaction!"); return; } AcDbObject *pObj = NULL ; AcDbDatabase *pDb = NULL; AcDbObjectId modelSpaceId; pDb = AcDbDatabase::cast(db); //get AcDbBlockTable for read if(Acad::eOk != pDb->getBlockTable(pBT, AcDb::kForRead)) { acutPrintf("can't open block table for read"); actrTransactionManager->abortTransaction(); return; } //get the model space object id if(Acad::eOk != pBT->getAt( ACDB_MODEL_SPACE, modelSpaceId)) { acutPrintf("\ncan't get model space Id"); actrTransactionManager->abortTransaction(); pBT->close(); return; } pBT->close(); //get model space block record for write from transaction if (Acad::eOk != pTrans->getObject((AcDbObject*&)pBTR, modelSpaceId, AcDb::kForWrite)) { acutPrintf("\ncan't open model space block table record for write"); actrTransactionManager->abortTransaction(); return; } AcDbObjectIdArray eIds; //get AcDbSortEntsTable AcDbSortentsTable *pSortTab = NULL; if(Acad::eOk != pBTR->getSortentsTable(pSortTab, AcDb::kForWrite, false)) { acutPrintf("\ncan't get AcDbSortEntsTable for write"); actrTransactionManager->abortTransaction(); return; } //put objectIds of all the entities in an Id array.The order of objectIds in the array is the //same as their draworders from bottom to top.The newly created entity is always at the top and the last item //in the array if(Acad::eOk != pSortTab->getFullDrawOrder(eIds)) { acutPrintf("\ncan't get full draworder"); pSortTab->close(); actrTransactionManager->abortTransaction(); return; } AcDbEntity *pRefEnt = NULL; //iterate through the entities in the order of their draworders. If an entity on the same layer is found //insert the newly created entity before it. int i; for(i =0; i<eIds.length(); i++) { es = pTrans->getObject((AcDbObject*&)pRefEnt, eIds.at(i), AcDb::kForRead); if(pRefEnt->layerId() == pEnt->layerId()) break; } eIds.insertAt(i, pEnt->objectId()); //remove the newly created entity from the end of the array eIds.removeLast(); //reset draworder es = pSortTab->setRelativeDrawOrder(eIds); pSortTab->close(); es=actrTransactionManager->endTransaction(); actrTransactionManager->flushGraphics(); //set flag for regen gbDraworderChanged = true; } }
Acad::ErrorStatus CZhfPalette::Wblock(AcDbDatabase*& pDbFrom, AcDbDatabase*& pDbTo, /*const AcGePoint3d& pt_3d_base,*/ const AcGeMatrix3d & xform) { Acad::ErrorStatus es ; AcDbObjectIdArray objIdsOut; AcDbBlockTable* pBT = NULL ; pDbFrom->getBlockTable(pBT, AcDb::kForRead); AcDbBlockTableRecord* pBTR = NULL; es = pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForRead); pBT->close(); AcDbBlockTableRecordIterator* pIT; es = pBTR->newIterator(pIT) ; for (; !pIT->done(); pIT->step()) { AcDbEntity* pEnt = NULL ; if (Acad::eOk==pIT->getEntity(pEnt, AcDb::kForRead)) { // if (!pEnt->isKindOf(AcDbAttributeDefinition::desc())) // { AcDbObjectId objId; if (Acad::eOk == pIT->getEntityId(objId)) { objIdsOut.append(objId); } // } pEnt->close() ; } } delete pIT; pBTR->close(); if (!objIdsOut.isEmpty()) { for (int i=0; i<objIdsOut.length(); i++) { AcDbObjectId objId = objIdsOut.at(i); AcDbEntity *pEnt = NULL ; if(Acad::eOk==acdbOpenAcDbEntity(pEnt,objId, AcDb::kForRead)) { AcDbObjectId objIdDic ; if ((objIdDic = pEnt->extensionDictionary())!= AcDbObjectId::kNull) { AcDbDictionary *pDict = NULL; if (Acad::eOk==acdbOpenObject(pDict, objIdDic, AcDb::kForWrite)) { pDict->setTreatElementsAsHard(Adesk::kTrue); pDict->close(); } } pEnt->close() ; } } AcDbDatabase *pTempDb ; es = pDbFrom->wblock( pTempDb, objIdsOut, AcGePoint3d::kOrigin ) ; if (Acad::eOk != es ) { acedAlert( _T("wblock failed!") ); return es ; } es = pDbTo->insert( xform, pTempDb ) ; if (Acad::eOk != es) acedAlert( _T("insert failed!" )); if (pTempDb) { delete pTempDb; pTempDb = NULL ; } } else { acutPrintf(_T("\nNo entities found in model space of DWG")); } return es ; }
void asdktest1 () { //----- Select the entities ads_name ss, en ; if ( acedSSGet (NULL, NULL, NULL, NULL, ss) != RTNORM ) return ; //----- Append entity IDs to the collector long n ; AcDbObjectId id ; AsdkHlrCollector collector ; collector.setDeleteState (true) ; acedSSLength (ss, &n) ; for ( int i =0 ; i < n ; i++ ) { acedSSName (ss, i, en) ; acdbGetObjectId (id, en) ; collector.addEntity (id) ; } acedSSFree (ss) ; //----- Get current viewport settings struct resbuf rb; acedGetVar(ACRX_T(/*NOXLATE*/"viewdir"), &rb); ads_point dirPt; acdbUcs2Wcs (rb.resval.rpoint, dirPt, Adesk::kTrue) ; acedGetVar(ACRX_T(/*NOXLATE*/"target"), &rb); ads_point tarPt; acdbUcs2Wcs (rb.resval.rpoint, tarPt, Adesk::kFalse) ; //----- Ask if non-visible edges should be created int hidLines =AfxMessageBox (ACRX_T("Would you like to see hidden lines?"), MB_YESNO) ; int honorInt =AfxMessageBox (ACRX_T("Would you like to honor internal visibility of polyface meshes or ACIS objects?"), MB_YESNO) ; int meshSils =AfxMessageBox (ACRX_T("Would you like to calculate silhouettes of polyface meshes?"), MB_YESNO) ; int unit =AfxMessageBox (ACRX_T("Would you like to unit solid before processing?"), MB_YESNO) ; //----- Process hidden line removal AsdkHlrEngine hlr ( asPnt3d (tarPt), asVec3d (dirPt), kEntity | kBlock | kSubentity | kProgress | (honorInt == IDYES ? kHonorInternals : 0) | (hidLines == IDYES ? kShowAll : 0) | (meshSils == IDYES ? kMeshSilhouettes : 0) | (unit == IDYES ? kUnite : 0) ) ; hlr.setAcisConversionProgressCallBack (progress1) ; hlr.setAhlProgressCallBack (progress2) ; hlr.setAcadConversionProgressCallBack (progress3) ; acedSetStatusBarProgressMeter (ACRX_T("HLR running: "), 0, 300) ; hlr.run (collector) ; acedRestoreStatusBar () ; //----- Assign color to the resulting entities //----- red for visible edges //----- blue for non-visible edges //----- yellow for internal edges n =collector.mOutputData.logicalLength () ; for (int i =0 ; i < n ; i++ ) { AsdkHlrData *p =collector.mOutputData [i] ; AcDbEntity *pEnt =p->getResultEntity () ; AsdkHlrData::Visibility vis =p->getVisibility () ; if ( vis == AsdkHlrData::kVisible ) { pEnt->setColorIndex (1) ; //----- Read } else if ( vis == AsdkHlrData::kInternallyHidden ) { if ( p->getHlrVisibility () == AsdkHlrData::kVisible ) pEnt->setColorIndex (2) ; //----- Yellow else pEnt->setColorIndex (3) ; //----- Green } else { pEnt->setColorIndex (5) ; //----- Blue } if ( postToDatabase (NULL, pEnt, id) != Acad::eOk ) { acutPrintf (_T("Failed to add entity to current space.\n")) ; break ; } if ( acdbOpenAcDbEntity (pEnt, id, AcDb::kForRead) != Acad::eOk ) { acutPrintf (_T("Failed to open last added outputed curve.\n")) ; break ; } //----- Entity originator path for block reference entities AcDbObjectIdArray ids =p->getObjectIds () ; if ( ids.logicalLength () > 0 ) { acutPrintf (ACRX_T("\n%lx, "), pEnt->objectId ().asOldId ()) ; if ( p->getSubentId ().type () != AcDb::kNullSubentType ) acutPrintf (ACRX_T("[%ld, %ld], "), p->getSubentId ().type (), p->getSubentId ().index ()) ; for ( int j =0 ; j < ids.logicalLength () ; j++ ) acutPrintf (ACRX_T("%lx, "), ids.at (j).asOldId ()) ; AcDbObjectId id =ids.last () ; if ( !id.isNull () ) { AcDbEntity *ent =NULL ; acdbOpenAcDbEntity (ent, id, AcDb::kForRead) ; id =ent->linetypeId () ; ent->close () ; if ( pEnt->upgradeOpen () == Acad::eOk ) pEnt->setLinetype (id) ; } } pEnt->close () ; } }
// This command demonstrates the use of kCleanup / kReuse flags void AddEntityToLayer (AsdkHlrCollector &collector, ACHAR *layerName) { //----- Check layer if ( layerName != NULL && *layerName != ACRX_T('\0') ) { AcDbDatabase *pDb =acdbHostApplicationServices ()->workingDatabase () ; AcDbLayerTable *pLayerTable ; pDb->getLayerTable (pLayerTable, AcDb::kForRead) ; if ( !pLayerTable->has (layerName) ) { AcDbLayerTableRecord *pLayerRecord =new AcDbLayerTableRecord ; pLayerRecord->setName (layerName) ; pLayerTable->upgradeOpen () ; pLayerTable->add (pLayerRecord) ; pLayerTable->downgradeOpen () ; pLayerRecord->close () ; pLayerTable->close () ; applyCurDwgLayerTableChanges () ; } else { pLayerTable->close () ; } } else { layerName =NULL ; } //----- Assign color to the resulting entities //----- red for visible edges //----- blue for non-visible edges //----- yellow for internal edges int n =collector.mOutputData.logicalLength () ; for ( int i =0 ; i < n ; i++ ) { AsdkHlrData *p =collector.mOutputData [i] ; AcDbEntity *pEnt =p->getResultEntity () ; AsdkHlrData::Visibility vis =p->getVisibility () ; if ( vis == AsdkHlrData::kVisible ) { pEnt->setColorIndex (1) ; //----- Read } else if ( vis == AsdkHlrData::kInternallyHidden ) { if ( p->getHlrVisibility () == AsdkHlrData::kVisible ) pEnt->setColorIndex (2) ; //----- Yellow else pEnt->setColorIndex (3) ; //----- Green } else { pEnt->setColorIndex (5) ; //----- Blue } if ( layerName != NULL ) pEnt->setLayer (layerName) ; AcDbObjectId id ; if ( postToDatabase (NULL, pEnt, id) != Acad::eOk ) { acutPrintf (_T("Failed to add entity to current space.\n")) ; break ; } //----- Entity originator path for block reference entities AcDbObjectIdArray ids =p->getObjectIds () ; if ( ids.logicalLength () > 0 ) { acutPrintf (ACRX_T("\n%ld, "), pEnt->objectId ().asOldId ()) ; for ( int j =0 ; j < ids.logicalLength () ; j++ ) { acutPrintf (ACRX_T("%ld, "), ids.at (j).asOldId ()) ; } } pEnt->close () ; } }
void asdktest3 () { //----- Create a line and a circle (memory only) AcDbLine *pLine =new AcDbLine (AcGePoint3d (), AcGePoint3d (100, 100, -100)) ; AcDbCircle *pCircle =new AcDbCircle (AcGePoint3d (50, 50, 0), AcGeVector3d (0, 0, 1) , 25.0) ; //----- Create a region from the circle AcDbVoidPtrArray arr1, arr2 ; arr1.append (pCircle) ; AcDbRegion::createFromCurves (arr1, arr2) ; AcDbRegion *pRegion =(AcDbRegion *)arr2.at (0) ; delete pCircle ; //----- Add the line and the region objects to the collector //----- NB: Remember those object are memory objects only AsdkHlrCollector collector ; collector.setDeleteState (true) ; collector.addEntity (pLine) ; collector.addEntity (pRegion) ; //----- Process hidden line removal AsdkHlrEngine hlr (AcGePoint3d (50, 50,0), AcGeVector3d (0, 0, 1), kEntity | kBlock | kShowAll | kProject | kHonorInternals) ; hlr.run (collector) ; //----- To easily see the result, we do append resulting entities to the current database //----- and use the color convention used in command 'TEST1' int n =collector.mOutputData.logicalLength () ; for ( int i =0 ; i < n ; i++ ) { AsdkHlrData *p =collector.mOutputData [i] ; AcDbEntity *pEnt =p->getResultEntity () ; AsdkHlrData::Visibility vis =p->getVisibility () ; if ( vis == AsdkHlrData::kVisible ) pEnt->setColorIndex (1) ; else pEnt->setColorIndex (5) ; AcDbObjectId id ; if ( postToDatabase (NULL, pEnt, id) != Acad::eOk ) { acutPrintf (_T("Failed to add entity to current space.\n")) ; break ; } //----- Entity originator path AcDbObjectIdArray ids =p->getObjectIds () ; if ( ids.logicalLength () > 0 ) { acutPrintf (ACRX_T("\n%ld, "), pEnt->objectId ().asOldId ()) ; for ( int j =0 ; j < ids.logicalLength () ; j++ ) { acutPrintf (ACRX_T("%ld, "), ids.at (j).asOldId ()) ; } } pEnt->close () ; } }