明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2059|回复: 12

[提问] 画线自动添加标注的LISP,有点小问题,求大大门修改下。

[复制链接]
发表于 2016-6-1 14:52 | 显示全部楼层 |阅读模式
首先感谢论坛大大们给我写的这个代码,可能最近他忙,没时间帮我修改了。
这段代码如果把CAD的标注样式改为宋体,标注文字就会压住直线。
求大大们帮忙修改下,我小白,真的不会 0.0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-6-27 22:52 | 显示全部楼层
朋友 怎么上文字固定颜色,不让它随层
发表于 2023-6-28 07:58 | 显示全部楼层
都是大神啊,學習了
发表于 2023-12-9 15:36 | 显示全部楼层
人才,高人,学习
发表于 2016-6-1 16:14 | 显示全部楼层
(defun c:ll( / rlastent ss n lent ps pe ang dist midp textdist bsang)
  (setq rlastent(entlast))
  (command "._line")
  (while (/= 0 (getvar "CMDACTIVE"))
    (command pause)
  )
  (if rlastent
    (progn
    (setq ss (ssadd))
    (while (setq rlastent(entnext rlastent))
        (ssadd rlastent ss)
    ))
    (setq ss(ssget "x"))
  )
  (setq textdist(* 0.5 (getvar "textsize"));文字距离线取默认字体高度的0.5,这个高度可自己调整--
        bsang(angle  '(0 0 0) (getvar "ucsxdir"));考虑UCS--------------------------------------
        bsang(* 180.0 (/ bsang pi))
        )
  (repeat (setq n(sslength ss))
    (setq n(1- n)
          rlastent(ssname ss n)
          lent(entget rlastent)
          ps(cdr(assoc 10 lent))
          pe(cdr(assoc 11 lent))
          ang(angle ps pe)
          dist(distance ps pe)
          midp(mapcar '+ pe ps)
          midp(mapcar '* midp '(0.5 0.5 0.5))
          textinp(trans (polar midp (+ ang (* pi 0.5)) textdist) 0 1)
          ang(* 180.0 (/ ang pi))
          )
    (if (>= 270 ang 90)(setq  textinp(trans (polar midp (+ ang (* pi -0.5)) textdist) 0 1) ang(- ang 180)));保证文字向上-----------

-----
    (command ".-text" "j" "bc" "non" textinp "" (- ang bsang) (rtos dist));文字高度就是这一行的"",这个可以自己调整,或者干脆和线长

度相关--
    (princ (rtos ang))
  )
  (princ)
)
 楼主| 发表于 2016-6-1 16:24 | 显示全部楼层
dingtiedt 发表于 2016-6-1 16:14
(defun c:ll( / rlastent ss n lent ps pe ang dist midp textdist bsang)
  (setq rlastent(entlast))
  ...

变成这样了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2016-6-1 18:00 | 显示全部楼层
本帖最后由 革天明 于 2016-6-2 10:52 编辑


我使用arx写的,如有需要可给出使用平台,我打个包才能用
        // This is command 'VIEWNAMEDICT'
        static void YTMsupportSetLineLength()
        {
                Acad::ErrorStatus es;
                ads_point pt0;
                if(acedGetPoint(NULL,_T("\n请选择起点:"),pt0)==RTNORM)
                {
                        ads_point pt1;
                        while(acedGetPoint(pt0,_T("\n请选择下一点:"),pt1)==RTNORM)
                        {
                                CCreatEnt::YTMAddLine(CCreatEnt::adsPointToPoint3d(pt0),CCreatEnt::adsPointToPoint3d(pt1));
                                AcGePoint3d midpoint;
                                midpoint=CCreatEnt::GetMiddlePoint(CCreatEnt::adsPointToPoint3d(pt0),CCreatEnt::adsPointToPoint3d(pt1));
                                double linelength=CCreatEnt::adsPointToPoint3d(pt0).distanceTo(CCreatEnt::adsPointToPoint3d(pt1));
                                CString lenstr;
                                lenstr.Format(_T("%f"),linelength);
                                //AcDbObjectId MtextId=CCreatEnt::YTMAddMText(CCreatEnt::PolarPoint(midpoint,CCreatEnt::PI()*0.5,2.5),lenstr,NULL,NULL,NULL);
                                AcDbMText *pMText = new AcDbMText();

                                // 设置多行文字的特性
                                //pMText->setTextStyle(style);
                                pMText->setContents(lenstr);
                                pMText->setLocation(CCreatEnt::PolarPoint(midpoint,CCreatEnt::PI()*0.25,10));
                                pMText->setTextHeight(10);
                                pMText->setWidth(2.5);
                                pMText->setAttachment(AcDbMText::kMiddleCenter);

                                AcDbObjectId MtextId=CCreatEnt::PostToModelSpace(pMText);

                                double ang=acutAngle(pt0,pt1);                               
                                CCreatEnt::Rotate(MtextId,CCreatEnt::ToPoint2d(midpoint),ang);
                                pt0[X]=pt1[X];
                                pt0[Y]=pt1[Y];
                                pt0[Z]=pt1[Z];
                        }
                }

        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2016-6-1 19:13 | 显示全部楼层
二楼这个可以使用啊。
  1. (defun c:ll( / rlastent ss n lent ps pe ang dist midp textdist bsang)
  2.   (setq rlastent(entlast))
  3.   (command "._line")
  4.   (while (/= 0 (getvar "CMDACTIVE"))
  5.     (command pause)
  6.   )
  7.   (if rlastent
  8.     (progn
  9.     (setq ss (ssadd))
  10.     (while (setq rlastent(entnext rlastent))
  11.         (ssadd rlastent ss)
  12.     ))
  13.     (setq ss(ssget "x"))
  14.   )
  15.   (setq textdist(* 0.5 (getvar "textsize"));文字距离线取默认字体高度的0.5,这个高度可自己调整--
  16.         bsang(angle  '(0 0 0) (getvar "ucsxdir"));考虑UCS--------------------------------------
  17.         bsang(* 180.0 (/ bsang pi))
  18.         )
  19.   (repeat (setq n(sslength ss))
  20.     (setq n(1- n)
  21.           rlastent(ssname ss n)
  22.           lent(entget rlastent)
  23.           ps(cdr(assoc 10 lent))
  24.           pe(cdr(assoc 11 lent))
  25.           ang(angle ps pe)
  26.           dist(distance ps pe)
  27.           midp(mapcar '+ pe ps)
  28.           midp(mapcar '* midp '(0.5 0.5 0.5))
  29.           textinp(trans (polar midp (+ ang (* pi 0.5)) textdist) 0 1)
  30.           ang(* 180.0 (/ ang pi))
  31.           )
  32.     (if (>= 270 ang 90)(setq  textinp(trans (polar midp (+ ang (* pi -0.5)) textdist) 0 1) ang(- ang 180)));保证文字向上----------------
  33.     (command ".-text" "j" "bc" "non" textinp "" (- ang bsang) (rtos dist));文字高度就是这一行的"",这个可以自己调整,或者干脆和线长度相关--
  34.     (princ (rtos ang))
  35.   )
  36.   (princ)
  37. )
发表于 2016-6-3 23:20 | 显示全部楼层
都是大神啊,学习了
 楼主| 发表于 2016-6-4 09:08 | 显示全部楼层
革天明 发表于 2016-6-1 18:00
我使用arx写的,如有需要可给出使用平台,我打个包才能用
        // This is command 'VIEWNAMEDICT'
...

谢谢你 文字有倒着的 能做成正的吗?都在直线上方
cad2008
 楼主| 发表于 2016-6-4 09:17 | 显示全部楼层
原来的作者改的,虽然我看不懂,还是发上来吧,
(defun c:ll( / rlastent ss n lent ps pe ang dist midp textdist bsang)
   (setq rlastent(entlast))
   (command "._line")
   (while (/= 0 (getvar "CMDACTIVE"))
     (command pause)
   )
   (if rlastent
     (progn
     (setq ss (ssadd))
     (while (setq rlastent(entnext rlastent))
         (ssadd rlastent ss)
     ))
     (setq ss(ssget "x"))
   )
   (setq textdist(* 0.2 (getvar "textsize"));文字距离线取默认字体高度的0.2,这个高度可自己调整--
        bsang(angle  '(0 0 0) (getvar "ucsxdir"));考虑UCS--------------------------------------
        bsang(* 180.0 (/ bsang pi))
         )
   (repeat (setq n(sslength ss))
     (setq n(1- n)
           rlastent(ssname ss n)
           lent(entget rlastent)
           ps(cdr(assoc 10 lent))
           pe(cdr(assoc 11 lent))
           ang(angle ps pe)
           dist(distance ps pe)
           midp(mapcar '+ pe ps)
           midp(mapcar '* midp '(0.5 0.5 0.5))
           )
     (cond
       ((>= (* 0.5 pi) ang 0);第一象限,
       (setq textinp(trans (polar midp (+ ang (* pi 0.5)) textdist) 0 1))
       )
       ((>= pi ang (* 0.5 pi));第二象限,
       (setq textinp(trans (polar midp (- ang (* pi 0.5)) textdist) 0 1))
        (setq ang(- ang pi))      
       )
       ((>= (* 1.5 pi) ang pi);第三象限,
       (setq textinp(trans (polar midp (- ang (* pi 0.5)) textdist) 0 1))
        (setq ang(- ang pi))
       )
       (t;第四象限,
       (setq textinp(trans (polar midp (+ ang (* pi 0.5)) textdist) 0 1))
        )
     )
     (setq ang(* 180.0 (/ ang pi)))
     (command ".-text" "j" "bc" "non" textinp "" (- ang bsang) (rtos dist));文字高度就是这一行的"",这个可以自己调整,或者干脆和线长度相关--
    (princ (rtos ang))
   )
   (princ)
)
发表于 2016-6-7 17:41 | 显示全部楼层
收藏
发表于 2016-6-8 21:25 | 显示全部楼层
本帖最后由 dingtiedt 于 2016-6-8 21:29 编辑
717957265 发表于 2016-6-4 09:17
原来的作者改的,虽然我看不懂,还是发上来吧,
(defun c:ll( / rlastent ss n lent ps pe ang dist midp  ...


楼主人品还是不错,能把原作者修改的再发上来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-19 11:37 , Processed in 0.185249 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表