明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1200|回复: 9

[提问] 一个软件里的程序 没有自定义函数 有高手能完善么!

[复制链接]
发表于 2014-12-1 09:28:43 | 显示全部楼层 |阅读模式
本帖最后由 xiguanyiren_y 于 2014-12-1 12:05 编辑

这个是一个软件里的程序,只知道下面的代码,有的自定义函数没有!
软件太多,只想用这个来画人行道线!
能否改成通用?


(defun ppsgetcfg(strvar / retv)
  (setq retv (getcfg (strcat "AppDATA/Hongye/PPS/" (strcase strvar))))
  (if (null retv) (setq retv ""))
  retv
)

;;;global variable   angle11  dist11 dist22 jlength1 angle3
(defun c:rxhd (/              p1       p2        p3         p4          angle1
             angle2   angle4   angle22        angle21         el          ell
             n              dist1    dist2        pfirst         psencond jlength
             jlength2 jxlength str        plwid          drawbx
             uctr     loop     olddrawbx         ptem
            )
  (setvar "CMDECHO" 0)
  (setvar "BLIPMODE" 0)
  (setq plwid (/ (DL_GetLayerLineWidth "PP-DL-RXHD") (DL_GetDrawingFactor)))
  (DL_MakeLayer "PP-DL-RXHD")
  (setq        drawbx          (ppsgetcfg "hysz_rxhd_drawbx")
        olddrawbx drawbx
  )
  (if (or (= drawbx "") (= drawbx nil))
    (setq drawbx "N")
  )
  (initget "Y N")
  (if (= drawbx "N")
    (progn
      (setq p1 (getkword "\n选择: 绘制两侧边线Y /<不绘两侧边线>:"))
      (if (= p1 "Y")
        (setq drawbx "Y")
      )
    )
    (progn
      (setq p1 (getkword "\n选择: 不绘两侧边线N /<绘制两侧边线>:"))
      (if (= p1 "N")
        (setq drawbx "N")
      )
    )
  )
  (setq        loop t)
        uctr (HY_ClearUNDO)
  )
  (while loop
    (setq angle4 nil
          jlength2 nil
    )
    (initget "U")
    (setq p1 (getpoint "\n回车退出 /回退U /输入人行横道线起点:"))
    (cond
      ((null p1) (setq loop nil))
      ((= p1 "U")
       ($undob uctr)
      )
      (t
       (initget 1)
       (setq p2 (getpoint p1 "\n输入人行横道线终点:"))
       (if (< (pmdist p1 p2) 1.0)
         (prompt "\n起点与终点距离太短!")
         (progn
           (initget (+ 2 4))
           (if (null dist11)
             (setq dist11 5.0)
           )
           (setq dist1
                  (getdist p1
                           (strcat "\n输入横道线宽度<" (rtos dist11 2 2) ">:")
                  )
           )
           (if (= dist1 nil)
             (setq dist1 dist11)
             (setq dist11 dist1)
           )
           (setq angle2 (angle p1 p2))
           (initget "X")
           (setq
             ptem (getpoint
                    p1
                    "\n回车与长度方向垂直 /选择平行线X /输入宽度方向:"
                  )
           )
           (cond
             ((= ptem nil)
              (setq angle1 (+ angle2 (* pi 0.5)))
             )
             ((= ptem "X")
              (setq angle1 (&tpxx_ang "\n选择平行线:"))
             )
             (t
              (setq angle1 (angle p1 ptem))
             )
           )
           (setq dist2 (pmdist p1 p2))
           (if (null jlength1)
             (setq jlength1 0.5)
           )
           (setq xh t)
           (while xh
             (initget (+ 2 4))
             (setq jlength (getreal (strcat "\n输入横道线间距<"
                                            (rtos jlength1 2 2)
                                            ">:"
                                    )
                           )
             )
             (if (> jlength dist2)
               (prompt "\n线间距须大于起点与终点长度,重输.")
               (progn
                 (if (null jlength)
                   (setq jlength jlength1)
                   (setq jlength1 jlength)
                 )
                 (setq jlength2        jlength
                       xh        nil
                 )
               )                        ;end of progn
             )                                ; end of if
           )                                ;end of while xh
           (setq pa (polar p1 angle1 (* dist1 0.5))
                 pb (polar p1 angle1 (* dist1 -0.5))
           )
           (setq p1 pa
                 p2 pb
                 p3 (polar p1 angle2 dist2)
                 p4 (polar p2 angle2 dist2)
           )
           (HY_UndoM)
           (HY_SV)
           (if (= drawbx "Y")
             (command "line" p1 p3 p4 p2 "c")
             (progn
               (command "line" p1 p2 "")
               (command "line" p3 p4 "")
             )
           )
           (setq angle21 (- angle2 angle1))
           (setq jxlength (/ jlength (abs (sin angle21))))
           (setq pfirst (polar p1 angle2 jxlength))
           (setq psencond (polar p2 angle2 jxlength))
           (command "pline" p1 "w" plwid "" p2 "")
           (setq el (entlast))
           (command "change" el "" "p" "c" 5 "")
           (command "pline" p3 "w" plwid "" p4 "")
           (setq ell (entlast))
           (setq n 0)
           (while (>= (pmdist p1 p3) (pmdist p1 pfirst))
             (setq n (+ n 1))
             (if (zerop (rem n 5))
               (progn
                 (command "pline" pfirst "w" plwid "" psencond "")
                 (setq el (entlast))
                 (command "change" el "" "p" "c" 5 "")
               )
               (command "pline" pfirst "w" plwid "" psencond "")
             )                                ;end of if
             (setq pfirst (polar pfirst angle2 jxlength))
             (setq psencond (polar psencond angle2 jxlength))
           )                                ;end of while
           (HY_RV)
         )
       )                                ;end of if pmdist p1 p2
      )
    )                                        ;end of cond
  )                                        ;end of while loop
  (if (/= drawbx olddrawbx)
    (setq drawbx (ppssetcfg "hysz_rxhd_drawbx" drawbx))
  )
  (setvar "BLIPMODE" 1)
  (setvar "CMDECHO" 1)
  (princ)
)                                        ;end

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-12-1 12:07:15 | 显示全部楼层
定一下!!!!
发表于 2014-12-1 12:18:23 | 显示全部楼层
你把VLX文件 或者 FAS文件发给我,我有时间看下。 050868@163.com
发表于 2014-12-1 14:50:35 | 显示全部楼层
看演示这个功能很简单嘛!分析别人的代码你还不如重写一个呢!
 楼主| 发表于 2014-12-1 15:24:47 | 显示全部楼层
spshchen 发表于 2014-12-1 12:18
你把VLX文件 或者 FAS文件发给我,我有时间看下。

如果有VLX和FAS 我就直接用了
是一个很大的专业软件!
 楼主| 发表于 2014-12-1 15:25:54 | 显示全部楼层
菡萏 发表于 2014-12-1 14:50
看演示这个功能很简单嘛!分析别人的代码你还不如重写一个呢!

如果能重写也可以的!
可惜我是业余的!
发表于 2014-12-1 19:31:20 | 显示全部楼层
xiguanyiren_y 发表于 2014-12-1 15:25
如果能重写也可以的!
可惜我是业余的!

在这论坛里混的,基本上没有一个是专业的!都是业余的!
 楼主| 发表于 2014-12-2 08:40:01 | 显示全部楼层
菡萏 发表于 2014-12-1 19:31
在这论坛里混的,基本上没有一个是专业的!都是业余的!

你说简单,能否帮忙写一下呢!
发表于 2014-12-2 09:34:32 | 显示全部楼层
本帖最后由 菡萏 于 2014-12-2 09:44 编辑
xiguanyiren_y 发表于 2014-12-2 08:40
你说简单,能否帮忙写一下呢!

代码仅是个绘制示例,请自行根据需要完善!
  1. (defun c:tt (/            PERDIST          OS         CMDECHO       P1     P2             P3            W           W1          D         LEN        N      ANG    ANG1
  2.              PT1    PT2           *error*
  3.             )
  4.   (defun *error* (s)
  5.     (setvar 'osmode os)
  6.     (setvar 'cmdecho cmdecho)
  7.     (princ s)
  8.   )

  9.   (defun PerDist (pt p1 p2 / norm)
  10.     (setq norm (mapcar '- p2 p1)
  11.           p1   (trans p1 0 norm)
  12.           pt   (trans pt 0 norm)
  13.     )
  14.     (- (car pt) (car p1))
  15.   )
  16.   (setq os (getvar 'osmode))
  17.   (setvar 'osmode 681)
  18.   (setq cmdecho (getvar 'cmdecho))
  19.   (setvar 'cmdecho 0)
  20.   (if (and
  21.         (setq p1 (getpoint  "\n起点:"))
  22.         (setq p2 (getpoint p1 "\n中点:"))
  23.         (setq p3 (getpoint p2 "\n终点:"))
  24.       )
  25.     (progn
  26.       (initget 6)
  27.       (setq w (getreal "\n半宽<0.5>:"))
  28.       (if (null w)
  29.         (setq w 0.5)
  30.       )
  31.       (setq w1 (getreal "\n间距<1.0>:"))
  32.       (if (null w1)
  33.         (setq w1 1.0)
  34.       )
  35.       (setq d (abs (perdist p1 p2 p3)))
  36.       (setq len (distance p2 p3))
  37.       (setq w1 (- (/ len (setq n (fix (/ len (+ w1 w w))))) w w))
  38.       (setq ang         (angle p2 p3)
  39.             ang1 (+ ang (* pi 0.5))
  40.       )
  41.       (setq pt1        (polar p2 ang1 (- d))
  42.             pt2        (polar pt1 ang1 (* 2 d))
  43.       )
  44.       (command "pline" "non" pt1 "H" w w "non" pt2 "")
  45.       (setq p1 pt1 p2 pt2)
  46.       (repeat n
  47.         (setq pt1 (polar pt1 ang (+ w w w1))
  48.               pt2 (polar pt1 ang1 (* 2 d))
  49.         )
  50.         (command "pline" "non" pt1 "non" pt2 "")
  51.       )
  52.       (command "line" "non" p1 "non" pt1 "")
  53.       (command "line" "non" p2 "non" pt2 "")
  54.     )
  55.   )
  56.   (setvar 'osmode os)
  57.   (setvar 'cmdecho cmdecho)
  58.   (princ)
  59. )

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +2 收起 理由
Gu_xl + 2 很给力!

查看全部评分

 楼主| 发表于 2014-12-2 11:19:37 | 显示全部楼层
本帖最后由 xiguanyiren_y 于 2014-12-2 11:49 编辑
菡萏 发表于 2014-12-2 09:34
代码仅是个绘制示例,请自行根据需要完善!

厉害!我看看! 能否 不用点起点和中点  这2点的距离是固定的2.5
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 19:27 , Processed in 0.180105 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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