╰☆珊瑚玉ヤ 发表于 2014-12-23 10:47:18

请大神完善CASS的高程注记消隐程序

昨天无意间看到一篇论文,就是关于lisp插件的,有关高程注记的消隐
感觉这个思路非常好,有一定的实用性。
里面有程序的主要部分,无奈本人对Lisp不在行,只会用……
大神们,可以下载了解下,看看有没有完善它的价值?小弟还是有必要的!期盼大神完善程序。

论文截图

效果截图

部分代码,根据论文,小弟手敲的哈:
(princ"请选择高程点:")
(setq s1(ssget":s"'((0. "insert"))))
    (if s1
       (progn
         (setq a1(ssname s1 9))
         (setq txt(entnext al))
         (setq txt(entget txt))
         (if(=(cdr(assoc 0 txt))"ATTRIB")
            (prign
            (setq pt1(cdr(assoc 10 txt)))
            (setq pt1(list(car pt1)(cadr pt1)))
            (setq txtbox(textbox txt))
            (setq txtbox(cdr txtbox))
            (setq txtbox(car txtbox))
            (setq x(car txtbox))
            (setq y(cadr txtbox))
            (setq pt1(polar pt1( *1.25 pi)0.1414))
            (setq pt2(polor pt2( *0.5pi)( +y0.2)))
            (setq pt3(polor pt2( *0.5pi)( +y0.2)))
            (command "wipeout" pt1 pt2 pt3 pt4 "c")
            (command "draworder" al "" "f")
            )
      (print"你选择的高程点没有属性!")
      )
   )
)

论文下载链接:http://yunpan.cn/cfUeKRBr2tiZa (提取码:1a7b)

gzxl 发表于 2014-12-23 16:42:20

好多错误,先纠正错误先
(defun c:tt (/ s1 a1 txt pt1 txtbox x y pt2 pt3)
(princ "\n请选择高程点:")
(setq s1 (ssget ":s" '((0 . "INSERT"))))
(if s1
    (progn
      (setq a1 (ssname s1 0))
      (setq txt (entnext a1))
      (setq txt (entget txt))
      (if (= (cdr (assoc 0 txt)) "ATTRIB")
      (progn
          (setq pt1 (cdr (assoc 10 txt)))
          (setq pt1 (list (car pt1) (cadr pt1)))
          (setq txtbox (textbox txt))
          (setq txtbox (cdr txtbox))
          (setq txtbox (car txtbox))
          (setq x (car txtbox))
          (setq y (cadr txtbox))
          (setq pt1 (polar pt1 (* 1.25 pi) 0.1414))
          (setq pt2 (polar pt1 0.0 (+ x 0.2)))
          (setq pt3 (polar pt2 (* 0.5 pi) (+ y 0.2)))
          (setq pt4 (polar pt1 (* 0.5 pi) (+ y 0.2)))
          (command "wipeout" pt1 pt2 pt3 pt4 "c")
          (command "draworder" al "" "f")
      )
      (print "你选择的高程点没有属性!")
      )
    )
)
)

gzxl 发表于 2014-12-23 16:42:56

好多错误,纠正错误先(defun c:tt (/ s1 a1 txt pt1 txtbox x y pt2 pt3)
(princ "\n请选择高程点:")
(setq s1 (ssget ":s" '((0 . "INSERT"))))
(if s1
    (progn
      (setq a1 (ssname s1 0))
      (setq txt (entnext a1))
      (setq txt (entget txt))
      (if (= (cdr (assoc 0 txt)) "ATTRIB")
      (progn
          (setq pt1 (cdr (assoc 10 txt)))
          (setq pt1 (list (car pt1) (cadr pt1)))
          (setq txtbox (textbox txt))
          (setq txtbox (cdr txtbox))
          (setq txtbox (car txtbox))
          (setq x (car txtbox))
          (setq y (cadr txtbox))
          (setq pt1 (polar pt1 (* 1.25 pi) 0.1414))
          (setq pt2 (polar pt1 0.0 (+ x 0.2)))
          (setq pt3 (polar pt2 (* 0.5 pi) (+ y 0.2)))
          (setq pt4 (polar pt1 (* 0.5 pi) (+ y 0.2)))
          (command "wipeout" pt1 pt2 pt3 pt4 "c")
          (command "draworder" al "" "f")
      )
      (print "你选择的高程点没有属性!")
      )
    )
)
)

yfy2003 发表于 2014-12-23 20:46:20

能改成ARX的吗?

gzxl 发表于 2014-12-24 00:19:03

ARX好像是这样写,好像有点问题      acDocManager->lockDocument(acDocManager->curDocument());      
      ads_name ss;
      struct resbuf *rb;
      rb = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("GC200"), RTNONE);
      int rt = acedSSGet(NULL, NULL, NULL, rb, ss);
      if (rt != RTNORM)
      {
            acutRelRb(rb);
            acedSSFree(ss);
            return;
      }
      acutRelRb(rb);
      long len;
      acedSSLength(ss, &len);

      for (int i = 0; i < len; i++)
      {
            ads_name ent, ssName, nextName;
            acedSSName(ss, i, ssName);
            acdbEntNext(ssName, nextName);

            AcDbObjectId entId = AcDbObjectId::kNull;
            AcDbEntity *pEnt = NULL;
            acdbGetObjectId(entId, nextName);
            if (acdbOpenObject(pEnt, entId, AcDb::kForWrite) == eOk)
            {
                if (pEnt->isKindOf(AcDbText::desc()))
                {
                  AcDbText *pText = AcDbText::cast(pEnt);
                  AcGePoint3d posPt = pText->position();
                  double ptX, ptY, boxX, boxY;
                  ptX = posPt.x;
                  ptY = posPt.y;
                  AcDbExtents Ext;
                  pText->getGeomExtents(Ext);
                  AcGePoint3d minPt, maxPt;
                  minPt = Ext.minPoint();
                  maxPt = Ext.maxPoint();
                  boxX = maxPt.x;
                  boxY = maxPt.y;
                  ads_point pt1, pt2, pt3, pt4;
                  acutPolar(asDblArray(posPt), 1.25 * PI, 0.1414, pt1);
                  acutPolar(pt1, 0.0, boxX + 0.2, pt2);
                  acutPolar(pt2, 0.5 * PI, boxY + 0.2, pt3);
                  acutPolar(pt1, 0.5 * PI, boxY + 0.2, pt4);

                  acedCommand(RTSTR, TEXT("wipeout"),
                        RT3DPOINT, pt1,
                        RT3DPOINT, pt2,
                        RT3DPOINT, pt3,
                        RT3DPOINT, pt4,
                        RTSTR, _T("C"),
                        RTNONE);
                  acedCommand(RTSTR, TEXT("draworder"),
                        RTENAME, ssName,
                        RTSTR, TEXT(""),
                        RTSTR, _T("F"),
                        RTNONE);
                  pText->close();

                }
                pEnt->close();
            }
      }
      acedSSFree(ss);
      acDocManager->unlockDocument(acDocManager->curDocument());

gzxl 发表于 2014-12-24 00:21:34

// 这里不对
boxX = maxPt.x;
boxY = maxPt.y;
页: [1]
查看完整版本: 请大神完善CASS的高程注记消隐程序