![]() |
【转帖】创建自己的曲线打断命令 - 精华帖集合
创建自己的曲线打断命令 - 精华帖集合
www.dimcax.com 创建自己的曲线打断命令 void drawentity(acdbentity* pentity); bool breakcurve(acdbcurve* curve, acgepoint3d pt); bool breakcurve(acdbcurve* curve, acgepoint3d p1, acgepoint3d p2); static void mybreak2008_mybreak(void) { // add your code for command mybreak2008._mybreak here ads_point pt1,pt2; ads_name entname; acad::errorstatus es; int ret; achar kword[100]; if (acedentsel(_t("\n选择所要打断的曲线:"), entname, pt1) !=rtnorm) { return; } acdbobjectid entid; acdbcurve *pcurve=null; acdbentity *pent = null; es = acdbgetobjectid(entid, entname); if (es != acad::eok) { return; } acdbopenobject(pent, entid, acdb::kforwrite); if (pent->iskindof(acdbcurve::desc())) { pcurve = acdbcurve::cast(pent); if (pcurve != null) { acedinitget (null, _t("f")); ret=acedgetpoint(null,_t("\n指定第二个打断点或[第一点(f)]:"),pt2); switch (ret) { case rtkword: ret=acedgetinput(kword); if ( ret!= rtnorm ) break ; acedinitget(rsg_nonull, _t("")); ret=acedgetpoint(null,_t("\n指定第一个打断点:"),pt1); if (ret!=rtnorm) break; acedinitget(rsg_nonull, _t("")); ret=acedgetpoint(null,_t("\n指定第二个打断点:"),pt2); if (ret!=rtnorm) break; breakcurve(pcurve,aspnt3d(pt1), aspnt3d(pt2)); break; case rtnone: breakcurve(pcurve,aspnt3d(pt1)); break; case rtnorm: breakcurve(pcurve,aspnt3d(pt1), aspnt3d(pt2)); break; default: break; } } } pent->close(); } //以下为函数 //打断于点 bool breakcurve(acdbcurve* curve,acgepoint3d pt) { acgepoint3d p1; curve->getclosestpointto(pt,p1); double param; curve->getparamatpoint(p1,param); acgedoublearray params; params.append(param); acdbvoidptrarray curvesegments; curve->getsplitcurves(params, curvesegments); acdbentity* ent =null; if (curvesegments.length()==2) { ent=(acdbentity*)curvesegments[0]; drawentity(ent); ent->close(); ent=(acdbentity*)curvesegments[1]; drawentity(ent); ent->close(); curve->erase(); } else { curve->close(); } return true ; } //两点打断 bool breakcurve(acdbcurve* curve, acgepoint3d p1, acgepoint3d p2) { acgepoint3d p11; curve->getclosestpointto(p1,p11); double param1; curve->getparamatpoint(p11,param1); acgepoint3d p21; curve->getclosestpointto(p2,p21); double param2; curve->getparamatpoint(p21,param2); acgedoublearray params; if (param1<param2) { params.append(param1); params.append(param2); } else { params.append(param2); params.append(param1); } acdbvoidptrarray curvesegments; curve->getsplitcurves(params, curvesegments); acdbentity* ent =null; if (curvesegments.length()==2) { ent=(acdbentity*)curvesegments[1]; drawentity(ent); ent->close(); } else if (curvesegments.length()==3) { ent=(acdbentity*)curvesegments[0]; drawentity(ent); ent->close(); ent=(acdbentity*)curvesegments[2]; drawentity(ent); ent->close(); } curve->erase(); return true ; } //绘制打断的曲线 void drawentity(acdbentity* pentity) { acdbblocktable *pblocktable; acdbhostapplicationservices()->workingdatabase() ->getsymboltable(pblocktable, acdb::kforread); acdbblocktablerecord *brec; resbuf tilemode; acedgetvar(_t("tilemode"),&tilemode); int tile=tilemode.resval.rint; if (tile) pblocktable->getat(acdb_model_space, brec,acdb::kforwrite); else pblocktable->getat(acdb_paper_space, brec,acdb::kforwrite); pblocktable->close(); acdbobjectid entid; brec->appendacdbentity(entid, pentity); brec->close(); } 复制代码 此段代码部分取材明经上的叶开,在此致谢。 这个命令与break唯一不同的是如果默认是打断于点 你稍微改造一下便可设置成自己方便的打断方式,譬如选择集打断 [ ] 程序很好! 因為專業, 所以精彩 !!! 好代码!!!!!!!!!!! 非常好啊! 啊 好程序,支持! |
所有的时间均为北京时间。 现在的时间是 12:33 AM. |