#include "StdAfx.h" #include "hlr.h" #include "hlrcommands.h" #ifdef ZWCAD #pragma comment(lib, "ZwHlr.lib") #endif #ifdef CMAKE #else #ifndef ZWCAD #if ARX ==18 #pragma comment(lib, "AsdkHlrApi18.lib") #elif ARX == 19 #pragma comment(lib, "AsdkHlrApi19.lib") #elif ARX == 20 #pragma comment(lib, "AsdkHlrApi20.lib") #elif ARX == 21 #pragma comment(lib, "AsdkHlrApi21.lib") #elif ARX == 22 #pragma comment(lib, "AsdkHlrApi22.lib") #elif ARX == 23 #pragma comment(lib, "AsdkHlrApi23.lib") #elif ARX == 24 #pragma comment(lib, "AsdkHlrApi24.lib") #elif ARX == 25 #pragma comment(lib, "AsdkHlrApi25.lib") #elif ARX == 26 #pragma comment(lib, "AsdkHlrApi26.lib") #else #endif #endif #endif // 收集所有实体在某个视口的消隐线 // 实体不包含block void _progress1(int percent_completed) { acedSetStatusBarProgressMeterPos(percent_completed); } void _progress2(int percent_completed) { acedSetStatusBarProgressMeterPos(100 + percent_completed); } void _progress3(int percent_completed) { acedSetStatusBarProgressMeterPos(100 + percent_completed); } void hlrCalc(AsdkHlrCollector &collector , AcDbViewport *pVp , const int &control , HLR::IDMapEntities &result // 结果,first-原实体 second-生成的消隐实体 , HLR::EntMapEntities &result2 // 结果,如果原实体没有id(在内存中),则保存结果到此 , HLR::EntMapInt &vbs // 每个结果实体的显示类型 , HLR::EntMapInt &hlrvbs) // 每个结果实体的hlr显示类型 { typedef HLR::IDMapEntities::iterator MPIT; typedef HLR::EntMapInt::iterator MVIT; if (!pVp) return; AsdkHlrEngine hlr(pVp, control); hlr.setAcisConversionProgressCallBack(_progress1); //hlr.setAhlProgressCallBack(progress2); // 崩溃,不知为何 hlr.setAcadConversionProgressCallBack(_progress3); acedSetStatusBarProgressMeter(ACRX_T("正在分析...: "), 0, 200); hlr.run(collector); acedRestoreStatusBar(); AcDbObjectId id; AcDbEntity *pEnt(NULL); for (int i = 0; i < collector.mOutputData.length(); i++) { AsdkHlrData *pResult = collector.mOutputData[i]; if (!pResult->getResultEntity()) continue; if (!pResult->getEntity() && pResult->getObjectIds().isEmpty()) continue; // 拷贝出结果 pEnt = (AcDbEntity *)pResult->getResultEntity()->clone(); if (!pEnt) continue; // 保存遮挡关系 vbs.insert(std::make_pair(pEnt, pResult->getVisibility())); hlrvbs.insert(std::make_pair(pEnt, pResult->getHlrVisibility())); if (pResult->getEntity()) id = pResult->getEntity()->id(); else id = pResult->getObjectIds().first(); // 如果 ID 有效, if (id.isValid()) { #if ARX > 23 auto pr = result.insert(std::make_pair(id, HLR::AcDbEntityArray())); #else HLR::IDMapEntities::_Pairib pr = result.insert(std::make_pair(id, HLR::AcDbEntityArray())); #endif pr.first->second.append(pEnt); continue; } else if (pResult->getEntity()) { #if ARX > 23 auto pr = result2.insert(std::make_pair(pResult->getEntity(), HLR::AcDbEntityArray())); #else HLR::EntMapEntities::_Pairib pr = result2.insert(std::make_pair(pResult->getEntity(), HLR::AcDbEntityArray())); #endif pr.first->second.append(pEnt); continue; } } } void HLR::hlr_collect_all(AcDbObjectIdArray &arIds // 原始实体 , AcDbEntityArray &arPtrs // 原始实体的指针,如果实体没有ID的情况下,用此参数传入 , const int &control // 控制参数 , AcDbViewport *pVp // 视口 , IDMapEntities &result // 结果,first-原实体 second-生成的消隐实体 , EntMapEntities &resutl2) // 结果,first-原实体 second-生成的消隐实体 { if (arPtrs.isEmpty() && arIds.isEmpty()) return; AsdkHlrCollector collector; if (!arPtrs.isEmpty()) collector.addEntities(arPtrs); if (!arIds.isEmpty()) collector.addEntities(arIds); EntMapInt vbs, hlrvbs; hlrCalc(collector, pVp, control, result, resutl2, vbs, hlrvbs); } void HLR::hlr_collect(AcDbObjectIdArray &arIds // 原始实体 , const int &control // 控制参数 , AcDbViewport *pVp // 视口 , IDMapEntities &result) // 结果,first-原实体 second-生成的消隐实体 { AcDbEntityArray arPtrs; if (arPtrs.isEmpty() && arIds.isEmpty()) return; AsdkHlrCollector collector; if (!arPtrs.isEmpty()) collector.addEntities(arPtrs); if (!arIds.isEmpty()) collector.addEntities(arIds); EntMapEntities resutl2; EntMapInt vbs, hlrvbs; hlrCalc(collector, pVp, control, result, resutl2, vbs, hlrvbs); } void HLR::hlr_lite(AcDbEntityArray &arPtrs , const int &control // 控制参数 , AcDbViewport *pVp // 视口 , EntMapEntities &result) { if (arPtrs.isEmpty()) return; AsdkHlrCollector collector; if (!arPtrs.isEmpty()) collector.addEntities(arPtrs); IDMapEntities result2; EntMapInt vbs, hlrvbs; hlrCalc(collector, pVp, control, result2, result, vbs, hlrvbs); for (IDMapEntities::iterator it(result2.begin()) ; it != result2.end() ; ++it) { for (int i = 0; i < it->second.length(); ++i) delete it->second[i]; it->second.removeAll(); } } void HLR::hlr_lite_ids(AcDbObjectIdArray &arids , const int &control // 控制参数 , AcDbViewport *pVp // 视口 , IDMapEntities &result) { if (arids.isEmpty()) return; AsdkHlrCollector collector; if (!arids.isEmpty()) collector.addEntities(arids); EntMapEntities result2; EntMapInt vbs, hlrvbs; hlrCalc(collector, pVp, control, result, result2, vbs, hlrvbs); for (EntMapEntities::iterator it(result2.begin()) ; it != result2.end() ; ++it) { for (int i = 0; i < it->second.length(); ++i) delete it->second[i]; it->second.removeAll(); } } void HLR::OrthoProjected3DSolidImp(AcDbEntity *pSolidClone , const AcGePlane &plan , AcGeMatrix3d &xformPlanToWorld , AcDbVoidPtrArray &arEntPtrs) { AsdkHlrCollector collector; AcDbEntity *pSubEnt = NULL; if (pSolidClone != NULL) { collector.addEntity(pSolidClone); } else { return; } 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); AcGeVector3d vtDir; AcGePoint3d ptOrg; AcGeVector3d vtu, vtV; vtDir = plan.normal(); plan.get(ptOrg, vtu, vtV); AsdkHlrEngine hlr( ptOrg/*asPnt3d (tarPt)*/, vtDir/*asVec3d (dirPt)*/, kEntity | kBlock | kSubentity | kProgress | kHonorInternals | kShowAll | kMeshSilhouettes | 0 ); hlr.run(collector); AsdkHlrData *p = NULL; int n = collector.mOutputData.logicalLength(); for (int i = 0; i < n; i++) { p = collector.mOutputData[i]; pSubEnt = p->getResultEntity(); AcDbCurve *pSubCrv = AcDbCurve::cast(pSubEnt); if (pSubCrv != NULL) { AcDbCurve *pProjCrv = NULL; pSubCrv->getOrthoProjectedCurve(plan, pProjCrv); if (pProjCrv != NULL) { pProjCrv->transformBy(xformPlanToWorld); arEntPtrs.append(pProjCrv); } } } }