几个实用的ObjectARX插件
来源:互联网 发布:淘宝店铺横幅尺寸 编辑:程序博客网 时间:2024/05/18 16:38
几个实用的插件
本文转载链接:几个实用的插件
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=169751&fromuid=7314821
删除重覆实体
acDocManager->lockDocument(acDocManager->curDocument());CDwgDatabaseUtil::setVar(_T("cmdecho"), 0); // 关闭回显acedCommand(RTSTR, _T("undo"), RTSTR, _T("be"), RTNONE);ads_name ssName;int rt = acedSSGet(_T("X"), NULL, NULL, NULL, ssName);if (rt != RTNORM){ return;}std::vector<CString> ssentVec;long length;acedSSLength(ssName, &length);acedSetStatusBarProgressMeter(_T("◎正在删除重覆实体,等稍等!"), 0, 100);DWORD dwCount = ::GetTickCount();for (int i = 0; i < length; i++){ // 100毫秒更新一次 if(::GetTickCount() - dwCount > 100) { acedSetStatusBarProgressMeterPos((int) (i * 100.0 / length)); dwCount = ::GetTickCount(); } ads_name ent; acedSSName(ssName, i, ent); struct resbuf *rbEnt; // 保存实体数据的结果缓冲区 struct resbuf *rb; // 用于遍历rbEnt的结果缓冲区 rbEnt = acdbEntGet(ent); // 从entName获得保存实体数据的结果缓冲区 rb = rbEnt; CString entname, typa, s10Ptx, s10Pty, s10Ptz, s11Ptx, s11Pty, s11Ptz, svNum; std::vector<CString> entVec; while (rb != NULL) { switch (rb->restype) { case 0: // 对象类型 typa.Format(_T("%s"), rb->resval.rstring); entVec.push_back(typa); break; case 10: // 起点(顶点)坐标 s10Ptx.Format(_T("%.2f"), rb->resval.rpoint[X]); s10Pty.Format(_T("%.2f"), rb->resval.rpoint[Y]); s10Ptz.Format(_T("%.2f"), rb->resval.rpoint[Z]); entVec.push_back(s10Ptx); entVec.push_back(s10Pty); entVec.push_back(s10Ptz); break; case 11: // 终点坐标 s11Ptx.Format(_T("%.2f"), rb->resval.rpoint[X]); s11Pty.Format(_T("%.2f"), rb->resval.rpoint[Y]); s11Ptz.Format(_T("%.2f"), rb->resval.rpoint[Z]); entVec.push_back(s11Ptx); entVec.push_back(s11Pty); entVec.push_back(s11Ptz); break; case 93: // 顶点数目 svNum.Format(_T("%f"), rb->resval.rreal); entVec.push_back(svNum); break; default: break; } rb = rb->rbnext; // 切换到下一个节点 } if (rbEnt != NULL) { acutRelRb(rbEnt); } CString entVeclist = CStringUtil::Join(entVec, _T(",")); ssentVec.push_back(entVeclist);}acedRestoreStatusBar();CString fistNaem = ssentVec[0]; // 首个ssentVec.erase(ssentVec.begin()); // 删除第一元素int index = 0;int len = ssentVec.size();int num = 0;while (len > 0){ for (int i = 0; i < ssentVec.size(); i++) { CString temp = ssentVec<i>; if (_tcscmp(fistNaem, temp) == 0) { ads_name ent; acedSSName(ssName, num, ent); AcDbObjectId entId; acdbGetObjectId(entId, ent); CEntityUtil::Erase(entId); index++; } } num = num + 1; fistNaem = ssentVec[0]; ssentVec.erase(ssentVec.begin()); len = ssentVec.size();}acedSSFree(ssName);acutPrintf(_T("\n共删除 %d 个重覆物体"), index);acDocManager->unlockDocument(acDocManager->curDocument());
文本加减乘除
acDocManager->lockDocument(acDocManager->curDocument());TCHAR szKword[132];acedInitGet(NULL, _T("A B C D"));int nReturn = acedGetKword(_T("\n输入选项[加(A)/减(B)/乘(C)/除(D)]:"), szKword);if (nReturn == RTNORM || nReturn == RTKWORD){ std::vector<AcRxClass*> descs; descs.push_back(AcDbText::desc()); descs.push_back(AcDbMText::desc()); AcDbEntity *pEnt = NULL; AcGePoint3d pickPoint; if (CSelectUtil::PromptSelectEntity(_T("\n请点选首个文本数字作为开头:"), descs, pEnt, pickPoint)) { CString strName; if (pEnt->isKindOf(AcDbText::desc())) { AcDbText *pText = AcDbText::cast(pEnt); strName = pText->textString(); // 截取字符串中的纯数字 sscanf(strName, _T("%*[A-Z,:] %[0-9,.]"), strName); } else { AcDbMText *pMText = AcDbMText::cast(pEnt); TCHAR *chaName; chaName = pMText->contents(); CString strName(chaName); int n = strName.ReverseFind(';'); strName = strName.Right(strName.GetLength() - n - 1); sscanf(strName, _T("%*[A-Z,:] %[0-9,.]"), strName); acutDelString(chaName); } double firstNum = CConvertUtil::ToDouble(strName); AcDbObjectIdArray entIds; if (CSelectUtil::PromptSelectEnts(_T("\n选择其它文本数字<可单选或多选>:"), descs, entIds)) { for (int i = 0; i < entIds.length(); i++) { AcDbEntity *pNEnt = NULL; if (acdbOpenObject(pNEnt, entIds<i>, AcDb::kForRead) == Acad::eOk) { if (pNEnt->isKindOf(AcDbText::desc())) { AcDbText *pText = AcDbText::cast(pNEnt); strName = pText->textString(); sscanf(strName, _T("%*[A-Z,:] %[0-9,.]"), strName); } else { AcDbMText *pMText = AcDbMText::cast(pNEnt); TCHAR *chaName; chaName = pMText->contents(); CString strName(chaName); int n = strName.ReverseFind(';'); strName = strName.Right(strName.GetLength() - n - 1); sscanf(strName, _T("%*[A-Z,:] %[0-9,.]"), strName); acutDelString(chaName); } } double secondNum = CConvertUtil::ToDouble(strName); if (_tcscmp(szKword, _T("A")) == 0) { firstNum = firstNum + secondNum; } else if (_tcscmp(szKword, _T("B")) == 0) { firstNum = firstNum - secondNum; } else if (_tcscmp(szKword, _T("C")) == 0) { firstNum = firstNum * secondNum; } else { firstNum = firstNum / secondNum; } pNEnt->close(); } CString firstStr = CConvertUtil::ToString(firstNum, 3); ads_point adsPoint; if (acedGetPoint(NULL, _T("拾取标注点:"), adsPoint) == RTNORM) { AcGePoint3d pt = asPnt3d(adsPoint); AcDbText *pText = new AcDbText(pt, firstStr, AcDbObjectId::kNull, 10, 0); pText->setColorIndex(1); CDwgDatabaseUtil::PostToModelSpace(pText); } pEnt->close(); } }}acDocManager->unlockDocument(acDocManager->curDocument());
修改颜色
acDocManager->lockDocument(acDocManager->curDocument());ads_name ss, en;if (acedSSGet(NULL, NULL, NULL, NULL, ss) != RTNORM){ return;}int colorindex;acedSetColorDialog(colorindex, true, 1);long len;if (RTNORM == acedSSLength(ss, &len)){ for (int i = 0; i < len; i++) { acedSSName(ss, i, en); AcDbObjectId id; acdbGetObjectId(id, en); AcDbEntity *pEnt; acdbOpenObject(pEnt, id, AcDb::kForWrite); AcCmColor colors; colors.setColorIndex(colorindex); if (pEnt->isKindOf(AcDbBlockReference::desc())) { AcDbBlockReference *pBlk = AcDbBlockReference::cast(pEnt); ChangeColor(pBlk, colors); } pEnt->setColor(colors); pEnt->close(); }}acedSSFree(ss);acDocManager->unlockDocument(acDocManager->curDocument());static void ChangeColor(AcDbBlockReference *pBlk, AcCmColor col){ AcDbObjectId blkId = pBlk->blockTableRecord(); AcDbBlockTableRecord *pBlkRcd; acdbOpenObject(pBlkRcd, blkId, AcDb::kForWrite); AcDbBlockTableRecordIterator *pItr; pBlkRcd->newIterator(pItr); for (pItr->start(); !pItr->done(); pItr->step()) { AcDbEntity *pEnt1; pItr->getEntity(pEnt1, AcDb::kForWrite); pEnt1->setColor(col); if (pEnt1->isKindOf(AcDbBlockReference::desc())) { AcDbBlockReference *pBlk1 = AcDbBlockReference::cast(pEnt1); ChangeColor(pBlk1, col); } pEnt1->close(); } delete pItr; pBlkRcd->close(); AcDbObjectIterator *attIt = pBlk->attributeIterator(); for (attIt->start(); !attIt->done(); attIt->step()) { AcDbAttribute *pAtt = NULL; AcDbObjectId attrObjId; attrObjId = attIt->objectId(); Acad::ErrorStatus es = acdbOpenObject(pAtt, attrObjId, AcDb::kForWrite); if (es == Acad::eOk) { pAtt->setColor(col); pAtt->close(); } } delete attIt; pBlk->setColorIndex(0);}
高程点移位
acDocManager->lockDocument(acDocManager->curDocument());int iosmode = 0;CDwgDatabaseUtil::GetVar(_T("osmode"), iosmode); // 获取捕捉状态值CDwgDatabaseUtil::setVar(_T("osmode"), 0); // 设置捕获关CDwgDatabaseUtil::setVar(_T("cmdecho"), 0); // 关闭回显acedCommand(RTSTR, _T("undo"), RTSTR, _T("be"), RTNONE);bool result = true;AcGePoint3dArray ptArray;ads_name ss;// 建立缓冲区链表AcDbObjectIdArray entIds;struct resbuf *rb, *retRb;CString myXdata = _T("202101");rb = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("gc200"), RTNONE);if (CCassUtil::PromptSelectEnts(_T("X"), myXdata, rb, entIds)){ long length = entIds.length(); for (int i = 0; i < length; i++) { AcDbEntity *pEnt = NULL; if (acdbOpenObject(pEnt, entIds[i], AcDb::kForWrite) == Acad::eOk) { CString layerName = pEnt->layer(); //图层名 AcGePoint2d zxPt, ysPt; // 文本的左下角点、右上角点 AcDbBlockReference *pBlk = AcDbBlockReference::cast(pEnt); AcGePoint3d pt3d = pBlk->position(); double ptz = pt3d.z; AcDbObjectIterator *pAttrIter = pBlk->attributeIterator(); AcDbAttribute *pAttr = NULL; AcDbObjectId attrObjId = NULL; CString strHeight; AcGePoint3d AlimPt, textPt; attrObjId = pAttrIter->objectId(); acdbOpenObject(pAttr, attrObjId, AcDb::kForWrite); strHeight = pAttr->textString(); double hh = pAttr->height(); // 文字高度 double ww = pAttr->widthFactor(); // 宽度比例系数 double ll = CTextUtil::getTextLength(strHeight, hh, ww); // 文字长度 AlimPt = pAttr->alignmentPoint(); // 对齐点 textPt = pAttr->position(); // 文本的位置点(左下角点) AcGePoint3d yPt1 = CGePointUtil::PolarPoint(textPt, 0.0, ll); // 向右 AcGePoint3d yPt2 = CGePointUtil::PolarPoint(yPt1, CMathUtil::PI() * 0.5, hh); // 向上 zxPt = CConvertUtil::ToPoint2d(textPt); // 文本的位置点(左下角点) ysPt = CConvertUtil::ToPoint2d(yPt2); // 文本的位置点(右上角点) CViewUtil::Set(textPt, yPt2, 3); retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE); int rt = acedSSGet(_T("C"), asDblArray(zxPt), asDblArray(ysPt), retRb, ss); if (rt != RTNORM) { pAttr->close(); delete pAttrIter; pBlk->close(); pEnt->close(); acutRelRb(retRb); acedSSFree(ss); result = false; continue; } else { acutRelRb(retRb); acedSSFree(ss); result = true; } AcGePoint2d ydPt1, ydPt2, xdPt1, xdPt2, xdPt3, xdPt4, xdPt5, xdPt6, xdPt7, xdPt8; if (result) { // 设定向下移动限制 double xzLen = hh; double yLen = 0; while (yLen < xzLen) { yLen = yLen + hh * 0.25; ydPt1 = CGePointUtil::PolarPoint(zxPt, CMathUtil::PI() * 1.5, yLen); ydPt2 = CGePointUtil::PolarPoint(ysPt, CMathUtil::PI() * 1.5, yLen); retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE); int rt = acedSSGet(_T("C"), asDblArray(ydPt1), asDblArray(ydPt2), retRb, ss); if (rt != RTNORM) { // 文本的位置点 AcGePoint3d setPosPt(ydPt1.x, ydPt1.y, ptz); AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5); pAttr->setHorizontalMode(AcDb::kTextLeft); // 左对齐 pAttr->setVerticalMode(AcDb::kTextVertMid); // 左中 pAttr->setPosition(setPosPt); pAttr->setAlignmentPoint(setAliPt); acutRelRb(retRb); acedSSFree(ss); result = false; break; } else { acutRelRb(retRb); acedSSFree(ss); result = true; } } } if (result) { // 设定向左移动限制 double yzLen = hh * 4; double yLen = 0; while (yLen < yzLen) { yLen = yLen + hh * 0.25; xdPt1 = CGePointUtil::PolarPoint(ydPt1, CMathUtil::PI(), yLen); xdPt2 = CGePointUtil::PolarPoint(ydPt2, CMathUtil::PI(), yLen); retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE); int rt = acedSSGet(_T("C"), asDblArray(xdPt1), asDblArray(xdPt2), retRb, ss); if (rt != RTNORM) { AcGePoint3d setPosPt(xdPt1.x, xdPt1.y, ptz); AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5); pAttr->setHorizontalMode(AcDb::kTextLeft); // 左对齐 pAttr->setVerticalMode(AcDb::kTextVertMid); // 左中 pAttr->setPosition(setPosPt); pAttr->setAlignmentPoint(setAliPt); acutRelRb(retRb); acedSSFree(ss); result = false; break; } else { acutRelRb(retRb); acedSSFree(ss); result = true; } } } if (result) { // 设定向上移动限制 double yzLen = hh * 2; double yLen = 0; while (yLen < yzLen) { yLen = yLen + hh * 0.25; xdPt3 = CGePointUtil::PolarPoint(xdPt1, CMathUtil::PI() * 0.5, yLen); xdPt4 = CGePointUtil::PolarPoint(xdPt2, CMathUtil::PI() * 0.5, yLen); retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE); int rt = acedSSGet(_T("C"), asDblArray(xdPt3), asDblArray(xdPt4), retRb, ss); if (rt != RTNORM) { AcGePoint3d setPosPt(xdPt3.x, xdPt3.y, ptz); AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5); pAttr->setHorizontalMode(AcDb::kTextLeft); pAttr->setVerticalMode(AcDb::kTextVertMid); pAttr->setPosition(setPosPt); pAttr->setAlignmentPoint(setAliPt); acutRelRb(retRb); acedSSFree(ss); result = false; break; } else { acutRelRb(retRb); acedSSFree(ss); result = true; } } } if (result) { // 设定向右移动限制 double yzLen = hh * 4; double yLen = 0; while (yLen < yzLen) { yLen = yLen + hh * 0.25; xdPt5 = CGePointUtil::PolarPoint(xdPt3, 0.0, yLen); xdPt6 = CGePointUtil::PolarPoint(xdPt4, 0.0, yLen); retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE); int rt = acedSSGet(_T("C"), asDblArray(xdPt5), asDblArray(xdPt6), retRb, ss); if (rt != RTNORM) { AcGePoint3d setPosPt(xdPt5.x, xdPt5.y, ptz); AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5); pAttr->setHorizontalMode(AcDb::kTextLeft); pAttr->setVerticalMode(AcDb::kTextVertMid); pAttr->setPosition(setPosPt); pAttr->setAlignmentPoint(setAliPt); acutRelRb(retRb); acedSSFree(ss); result = false; break; } else { acutRelRb(retRb); acedSSFree(ss); result = true; } } } if (result) { // 设定向下移动限制 double yzLen = hh; double yLen = 0; while (yLen < yzLen) { yLen = yLen + hh * 0.25; xdPt7 = CGePointUtil::PolarPoint(xdPt5, CMathUtil::PI() * 1.5, yLen); xdPt8 = CGePointUtil::PolarPoint(xdPt6, CMathUtil::PI() * 1.5, yLen); retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE); int rt = acedSSGet(_T("C"), asDblArray(xdPt7), asDblArray(xdPt8), retRb, ss); if (rt != RTNORM) { AcGePoint3d setPosPt(xdPt7.x, xdPt7.y, ptz); AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5); pAttr->setHorizontalMode(AcDb::kTextLeft); pAttr->setVerticalMode(AcDb::kTextVertMid); pAttr->setPosition(setPosPt); pAttr->setAlignmentPoint(setAliPt); acutRelRb(retRb); acedSSFree(ss); result = false; break; } else { acutRelRb(retRb); acedSSFree(ss); result = true; } } if (result) { ptArray.append(pt3d); } } pAttr->close(); delete pAttrIter; pBlk->close(); pEnt->close(); } } acutRelRb(rb); if (ptArray.length() > 0) { CLayerUtil::Add(_T("检查"), 1); int i = 0; for (i; i < ptArray.length(); i++) { AcGeVector3d vec(0, 0, 1); AcDbCircle *pCircle = new AcDbCircle(ptArray[i], vec, 2.0); pCircle->setLayer(_T("检查")); CDwgDatabaseUtil::PostToModelSpace(pCircle); } acutPrintf(_T("\n高程点处理完毕,有: %d 个未处理。已画圆为标记请检查!"), i); }}else{ AfxMessageBox(_T("只限定CASS的合成高程点!")); acutRelRb(rb);}CDwgDatabaseUtil::setVar(_T("osmode"), iosmode); // 还原捕捉状态值acDocManager->unlockDocument(acDocManager->curDocument());
0 0
- 几个实用的ObjectARX插件
- 推荐几个实用的FireFox扩展插件
- 推荐几个比较实用的浏览器插件
- 几个实用插件搜集
- 推荐几个实用的Visual Studio 2010的插件
- firefox下几个实用的免费开发插件
- firefox下几个实用的免费开发插件
- firefox下几个实用的免费开发插件
- 分享几个实用的Javascript动态更新图标插件
- 几个实用的软件
- Xcode安装插件方法(大白适用)与几个实用的插件
- Atom 了,介绍几个实用插件
- jquery实用的插件
- 实用的火狐插件
- 实用的jQuery插件
- 实用的chrome插件
- 实用的分页插件
- 几个简单实用的javascrit
- 多个div平分一个div的宽度
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- Android线程与线程池(一)
- 安卓获取屏幕大小
- 一道递归思想的排列组合题目
- 几个实用的ObjectARX插件
- Dev 控件imageComboBoxEdit 添加图片
- IOS 动态添加方法
- 求两个数字之和(c++)
- 精选30道Java笔试题解答
- github常用命令
- IOS的文件系统
- js实现一个自定义的滚动条
- css3 attr和content 属性