找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3852|回复: 13

[已解决] 画圆及中心线

[复制链接]

已领礼包: 3198个

财富等级: 富可敌国

发表于 2014-9-7 01:40:53 | 显示全部楼层 |阅读模式
悬赏50D豆已解决
本帖最后由 lucas3 于 2014-9-9 17:38 编辑

173807gss6kjkrh7sy76ow.png
1. 首先,拾取放置中心点
2. 输入大圆直径 :30 (也可拾取,也可输入)
3. 输入小圆直径: 10
4. 输入均布个数: 6
5. 输入偏移角度: 30
绘制出6个圆,并绘制出中心线,那个直经为30的圆也属于中心线, 中心线图层为中心线层,圆为当前图层,
中心线每端超出圆的长度=圆直径*0.2倍 (图中所示,每端超出为2,)
注:图中的一条过圆中心的水平直线不用绘出,只是标偏移角参照用


最佳答案

查看完整内容

就替换几句话而已
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-7 23:46:16 | 显示全部楼层
再体会体会 ODCL 用法(ODCL 8.0 以上),参数获取用 非模态对话框 ,点击绘图自动关闭对话框,同时分开写还可以增加命令行版本,无需界面
  1. ;;初始值设置
  2. (mapcar        '(lambda (x y)
  3.            (if (not (eval x))
  4.              (set x y)
  5.            )
  6.          )
  7.         '($globle_dRadius
  8.           $globle_sRadius
  9.           $globle_Angle
  10.           $globle_number
  11.          )
  12.         '(30.0 10.0 30.0 6)
  13. )

  14. ;;角度按钮
  15. (defun c:test/form1/aPick#OnClicked (/ an)
  16.   (if (setq an (getangle (strcat "\n偏转角度<"
  17.                                  (vl-princ-to-string $globle_angle)
  18.                                  ">: "
  19.                          )
  20.                )
  21.       )
  22.     (progn
  23.       (setq $globle_angle (* (/ an pi) 180.))
  24.       (dcl-control-settext
  25.         test/form1/Angle
  26.         (vl-princ-to-string $globle_angle)
  27.       )
  28.     )
  29.   )
  30.   (princ)
  31. )
  32. ;;大圆直径按钮
  33. (defun c:test/form1/dPick#OnClicked (/ d)
  34.   (if (setq d (getdist (strcat "\n大圆直径<"
  35.                                (vl-princ-to-string $globle_dradius)
  36.                                ">: "
  37.                        )
  38.               )
  39.       )
  40.     (progn
  41.       (setq $globle_dradius d)
  42.       (dcl-control-settext
  43.         test/form1/dradius
  44.         (vl-princ-to-string $globle_dradius)
  45.       )
  46.     )
  47.   )
  48.   (princ)
  49. )
  50. ;;小圆直径按钮
  51. (defun c:test/form1/sPick#OnClicked (/ d)
  52.   (if (setq d (getdist (strcat "\n小圆直径<"
  53.                                (vl-princ-to-string $globle_sradius)
  54.                                ">: "
  55.                        )
  56.               )
  57.       )
  58.     (progn
  59.       (setq $globle_sradius d)
  60.       (dcl-control-settext
  61.         test/form1/sradius
  62.         (vl-princ-to-string $globle_sradius)
  63.       )
  64.     )
  65.   )
  66.   (princ)
  67. )
  68. ;;绘制按钮
  69. (defun c:test/form1/Draw#OnClicked (/)
  70.   (mapcar
  71.     '(lambda (x y)
  72.        (setq x (distof (dcl-control-gettext (eval y))))
  73.      )
  74.     '($globle_dRadius $globle_sRadius $globle_Angle)
  75.     '(test/form1/dRadius test/form1/sRadius test/form1/Angle)
  76.   )
  77.   (setq        $globle_Number
  78.          (atoi (dcl-control-gettext test/form1/Number))
  79.   )
  80.   (dcl-form-close test/form1)
  81.   (DoDrawCircle t)
  82.   (princ)
  83. )
  84. ;;命令行版本
  85. (defun CmdGetInput (/ d d1 an i)
  86.   (if (setq d (getdist (strcat "\n大圆直径<"
  87.                                (vl-princ-to-string $globle_dradius)
  88.                                ">: "
  89.                        )
  90.               )
  91.       )
  92.     (setq $globle_dradius d   )
  93.   )
  94.   (if (setq d1 (getdist        (strcat        "\n小圆直径<"
  95.                                 (vl-princ-to-string $globle_sradius)
  96.                                 ">: "
  97.                         )
  98.                )
  99.       )
  100.     (setq $globle_sradius d1)
  101.   )
  102.   (if (setq an (getangle (strcat "\n偏转角度<"
  103.                                  (vl-princ-to-string $globle_angle)
  104.                                  ">: "
  105.                          )
  106.                )
  107.       )
  108.     (setq $globle_angle (* (/ an pi) 180.))
  109.   )
  110.   (if (setq i (getint (strcat "\n数量<"
  111.                               (vl-princ-to-string $globle_number)
  112.                               ">: "
  113.                       )
  114.               )
  115.       )
  116.     (setq $globle_number i)
  117.   )
  118.   (DoDrawCircle t)
  119. )
  120. ;;绘制主程序
  121. ;;可以单独写命令行版本
  122. (defun DoDrawCircle (tf / p drawscircle)
  123.   (defun drawscircle (p r an num / pc circle d ln mat)
  124.     (setq pc         (polar p (setq an (* pi (/ an 180.))) (/ $globle_dradius 2))
  125.           circle (xdrx_circle_make pc r)
  126.           d         (* 1.2 r)
  127.           ln         (xdrx_line_make (polar pc an d) (polar pc (+ pi an) d))
  128.     )
  129.     (ssadd circle ln)
  130.     (setq mat (xdrx_matrix_setrotation
  131.                 mat0
  132.                 (/ (+ pi pi) num)
  133.                 '(0 0 1)
  134.                 p
  135.               )
  136.     )
  137.     (repeat (fix num)
  138.       (setq ln (xdrx_entity_transformedcopy
  139.                  ln
  140.                  mat
  141.                )
  142.       )
  143.     )
  144.   )
  145.   (while (setq p (getpoint "\nCenter: "))
  146.     (xdrx_circle_make p (/ $globle_dradius 2.))
  147.     (drawscircle
  148.       p
  149.       (/ $globle_sradius 2.)
  150.       $globle_angle
  151.       $globle_number
  152.     )
  153.   )
  154. )
  155. ;;主界面启动
  156. (defun c:tt (/ str lst)
  157.   (defun c:test/form1#OnInitialize (/)
  158.     (mapcar
  159.       '(lambda (x y)
  160.          (dcl-control-settext (eval x) y)
  161.        )
  162.       '(test/form1/dRadius
  163.         test/form1/sRadius
  164.         test/form1/Angle
  165.         test/form1/Number
  166.        )
  167.       (mapcar
  168.         'vl-princ-to-string
  169.         (list $globle_dRadius
  170.               $globle_sRadius
  171.               $globle_Angle
  172.               $globle_Number
  173.         )
  174.       )
  175.     )
  176.   )
  177.   (setq        str '("YWt6AwYvAAC9hE4ABuKT57URZStquEFZyA0rMiFudDRpO1M0OzadqDc2Jl4/3XQWYFhvdDZrtvfj"
  178.               "yJqv1jdhCj9IUvQkd8+fX24cu/TZuj0c/y4lLidrCy/PnnE+/Hx1PvY5vEe5bbGiTTfSL9Ky+rI6"
  179.               "HbGZDZmwA+Khx5kwyFCyUb5H7c1WH3jNNn6GyH+mumkaps3hcnsKrRlppJfUa4Uv2pUvxBTZIQ3a"
  180.               "JZeJMFevNBlvXQoINIdikFkL/hKM3nvQz/1SRxq3pDCJmJbgEFS7WammMwvzN0N7zPO3Ed0q0D6L"
  181.               "Ci4zAiPckWJIXV3z2n2md+0+Y+L9YO1E+m1G9zdUENAchdy7Vxx47/qZTg2sDUcA3nSzfKzwMg61"
  182.               "s0fboSqEIdsxVQN3V5UHpaOZw7OEBSuA8tuRZLt9JuLcSMYjpfN/Mp8vRPHtm0bzrHoD4N3s2EAf"
  183.               "iY5NiffcQS+ELdtBKITcFJ/VNIHTiifbrXclgZ2wfkG2ksjY0UBDgqON4/241sXAzzS/kgslN3D+"
  184.               "cvGM41zlyjnaca/eaxamNLWGOmMy29B/ySAQ/jclK1tRczPpwMZOSxlI1yCWB+DMkLWKH3bFlkI4"
  185.               "8+bewSOW37HdTrEolO+Z5G00MSik7Yb9gw0ip1nqiIapFdJlQ526GaBNxQobYCmIBSKzY06D0AD1"
  186.               "ix+bY8M0iVeD5qw2pp3Ymcsn89UZ4IHaTb3bZTuQjbMN0Xp1YJ6I1I3SxzHUh42Gv3CGgx7EOv9S"
  187.               "BZMb7SwA5C+ggd/0SWFXg/9UgcCskVeD0Kwvi72xo4/Ft5tDAMfrk1PU4/O04MmZoyIug4iGkyvI"
  188.               "scWx6Q+GJ8uZGBtitImB1oKQackBLIBZSiYE8cShvbcNzkcXOHNGd747aHBpyfUi9/UiU8eW/OH1"
  189.               "/4K6NakhApmXqw5fg/XHVskNYw2PWhJQYD82IqJYDFtQcKrs9UKCIhJH7GCAk4p1sbqVOw5QRtOF"
  190.               "QQ9fD629u0/6urvTXCmc3ATAYv71F4bHFgBUmLzMER5Q2kFgULBdelCmxL3v9PUa8ZJdsXofnCng"
  191.               "TXF9wmpXeJQawcXMgUlTiWDec/XzVMFvRlaRfzhPMBv1D+h7+eTqpVCnqxX0IC+Dji6KWxL0WvWv"
  192.               "asMgj4wMweUis9HXwup3618sCHRIG1MmJbQGi7WOlutvBK7JhIotbVkbg0cn68pIi+LSrGBsgSzV"
  193.               "7aZL5+S8FNWwmP6CKp0b5dWbkzUqhpcsg9C4MfVkmY0UYjjqYCikvaG9zoeF5IsDtIEk66gC6OrA"
  194.               "KYuZzKwRUsE0iM2D9syh04IB4Rmr4/VekR3Ug9WbwSXzIf4GDmgwQqZYrGlxLHGvzAjqosJqWmT2"
  195.               "sFRjXmSabtMWLvFGZI4PbghKhnSfOP1A0tEWjnqSFg5mb/J4EsM92lF5MWvuCWyiKxqfPMm0vJk5"
  196.               "EHIrt7wJUOH7xbN05Pn1oP4HxppJFeb59fAuYMBa9xXj+Vnj/yb0yuck7kj6JO1Ibe345spe2gu+"
  197.               "WBNiX+/IO9rhyhxTNuU70zdVuNpfpNo7k6NsgX2kNaQ7+j5k8SA42hFRp079PzSr9Jq42bafqQ5B"
  198.               "V5UewuHyogDMeUj/KW6QAMxplRVBx5qkZMuDWsmYaO+A9i5yVVy2BMN/XLyRDzqmLm8ft2JeHG//"
  199.               "8YF+3uk/Cg=="
  200.              )
  201.         lst (list $globle_dRadius
  202.                   $globle_sRadius
  203.                   $globle_Angle
  204.                   $globle_Number
  205.             )
  206.   )
  207.   (dcl-project-import str)
  208.   (dcl-form-show test/form1)
  209.   (princ)
  210. )
  211. ;;命令行版本
  212. (defun c:tt1 (/) (CmdGetInput) (princ))

点评

必须用ODCL 8.0以上版本吗? 8.0以上有什么新的东西?  详情 回复 发表于 2014-9-8 02:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-8 07:15:25 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2014-9-8 08:22 编辑
newer 发表于 2014-9-8 02:19
必须用ODCL 8.0以上版本吗? 8.0以上有什么新的东西?

因为用的电脑只有AutoCAD 2015 ,8.X版本ODCL才支持15,上班后再改成低版本的
说到8.X的好处, 这个程序是第一次用8.07写, 确实有方便之处
1 最高支持2015
2  函数名连接由下划线改成横线,而且两者均显示为内置函数,好处就是输入不必按shift再按下划线,方便输入同时也保持对低版的兼容
3 控件名由  /  代替下划线,好处同2

我在想这种获取输入参数的方式怎样更高效一些,界面上既可以输入也可以拾取,在 Modal 方式下点界面上任何一个拾取按钮就直接拾取该对应参数,其它都用界面内的默认值,不再返回界面,或者在 Modaless 模式下,界面一直显示,输入和点取改变界面输入框的值,只有点界面内的绘制才是获取界面内参数进入绘制主程序

第一种方法可能对已经养成的习惯需要再适应

2015 API  用8.30 号那个 x64 版本绘制 circle 提示 Lockxxx , 新版本没有试
20140908075620.jpg
777.gif

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2014-9-7 01:40:54 | 显示全部楼层
lucas3 发表于 2014-9-7 19:17
谢谢Free-Lancer 大师,感谢您的再次帮助,
能不能脱离API呢?用您的app.fas函数,主要是 ...

就替换几句话而已
  1. (mapcar        '(lambda (x y)
  2.            (if (not (eval x))
  3.              (set x y)
  4.            )
  5.          )
  6.         '($globle_dradius $globle_sradius $globle_num $globle_angle)
  7.         '(30. 10. 6 30.)
  8. )
  9. (defun c:tt (/               actionkey dopick           doaccept  drawscircle
  10.              getinput  strl         $keyinput fn             id
  11.              p               lst
  12.             )
  13.   ;;手动输入
  14.   (defun actionkey (kl)
  15.     (mapcar
  16.       '(lambda (x)
  17.          (action_tile
  18.            x
  19.            "(set (read (strcat \"$globle_\" $key ))(distof $value))"
  20.          )
  21.        )
  22.       kl
  23.     )
  24.   )
  25.   ;;点击拾取
  26.   (defun dopick        (key)
  27.     (if        (= key "apick")
  28.       (setq $keyinput 1)
  29.       (setq $keyinput 0)
  30.     )
  31.     (done_dialog)
  32.   )
  33.   ;;点击确定
  34.   (defun doaccept ()
  35.     (setq lst (dcl:gettile '("dradius" "sradius" "angle" "num")))
  36.     (done_dialog)
  37.   )
  38.   ;;绘制小圆
  39.   (defun drawscircle (p r an num / pc circle d ln mat an1 an0 lst)
  40.     (setq pc         (polar p an (/ $globle_dradius 2))
  41.           circle (vlax-invoke (fy:acspace) 'AddCircle pc r)
  42.           ;;(xdrx_circle_make pc r)
  43.           d         (* 1.2 r)
  44.           ln         (vlax-invoke
  45.                    (fy:Acspace)
  46.                    'Addline
  47.                    (polar pc an d)
  48.                    (polar pc (+ pi an) d)
  49.                  )
  50.                  ;;(xdrx_line_make (polar pc an d) (polar pc (+ pi an) d))
  51.     )
  52.     (vla-put-layer ln "中心线")
  53.     ;;(ssadd circle ln)
  54.     ;|
  55.     (setq an1 (/ (+ pi pi) num)
  56.           mat (xdrx_matrix_setrotation
  57.                 mat0
  58.                 an1
  59.                 '(0 0 1)
  60.                 p
  61.               )
  62.     )
  63.     (repeat (fix num)
  64.       (setq ln (xdrx_entity_transformedcopy
  65.                  ln
  66.                  mat
  67.                )
  68.       )
  69.     )|;
  70.     (mapcar '(lambda (x)
  71.                (vla-arraypolar
  72.                  x
  73.                  (fix num)
  74.                  (+ pi pi)
  75.                  (vlax-3d-point p)
  76.                )
  77.              )
  78.             (list circle ln)
  79.     )   
  80.   )
  81.   (defun getinput (/ dc an)
  82.     (if        (and (zerop $keyinput)
  83.              (setq
  84.                dc (getdist (strcat "\n大圆半径<"
  85.                                    (vl-princ-to-string $globle_dradius)
  86.                                    ">: "
  87.                            )
  88.                   )
  89.              )
  90.         )
  91.       (setq $globle_dradius dc)
  92.     )
  93.     (if        (and (= $keyinput 1)
  94.              (setq
  95.                an (getangle (strcat "\n偏转角度<"
  96.                                     (vl-princ-to-string $globle_angle)
  97.                                     ">: "
  98.                             )
  99.                   )
  100.              )
  101.         )
  102.       (setq $globle_angle (math:rtd an))
  103.     )
  104.   )
  105.   (setq        strl
  106.          '("temp:dialog {"
  107.            "    label = \"圆绘制\" ;"
  108.            "    :boxed_column {"
  109.            "     label =\"参数\" ;"
  110.            "        :row {"
  111.            "            :edit_box {   key = \"dradius\" ;  label = \"大圆直径\" ; }"
  112.            "           :button { key = \"dpick\" ; label = \"拾取\" ;  width = 8 ; }"
  113.            "       }"
  114.            "      :row {"
  115.            "          :edit_box { key = \"angle\" ; label = \"偏转角度\" ; }"
  116.            "           :button { key = \"apick\" ; label = \"拾取\" ; width = 8 ;}"
  117.            "      }"
  118.            "     :row {"
  119.            "          :edit_box { key = \"sradius\" ; label = \"小圆直径\" ;}"
  120.            "          :edit_box { key = \"num\" ;  label = \"数量\" ; }"
  121.            "      }"
  122.            "  }"
  123.            "   ok_cancel;"
  124.            "   errtile;"
  125.            "}"
  126.           )
  127.   )
  128.   ;;Main program
  129.   (setq        fn (dcl:make strl) ;_写出DCL
  130.         id (dcl:load fn "temp") ;_加载DCL
  131.   )
  132.   (dcl:settile
  133.     '("dradius" "sradius" "angle" "num")
  134.     (mapcar 'vl-princ-to-string
  135.             (list $globle_dradius
  136.                   $globle_sradius
  137.                   $globle_angle
  138.                   $globle_num
  139.             )
  140.     )
  141.   ) ;_设置默认值
  142.   (dcl:chknumin '("dradius" "sradius" "angle" "num")) ;_检查输入格式
  143.   (actionkey '("dradius" "sradius" "angle" "num")) ;_手动输入时记录变量
  144.   (mapcar '(lambda (x) (action_tile x "(dopick $key)"))
  145.           '("dpick" "apick")
  146.   ) ;_点取拾取按钮后进入命令行模式
  147.   (action_tile "accept" "(doaccept)") ;_点击确定直接进入绘图
  148.   ;;主程序
  149.   (dcl:start id fn) ;_start dialog
  150.   (if (or $keyinput lst) ;_点击确定或者点拾取后继续
  151.     (progn
  152.       (if lst
  153.         (mapcar
  154.           'set
  155.           '($globle_dradius $globle_sradius $globle_angle $globle_num)
  156.           (mapcar 'read lst)
  157.         )
  158.         (getinput)
  159.       )
  160.       (while (setq p (getpoint "\n中心点: "))
  161.         (vlax-invoke
  162.           (fy:acspace)
  163.           'AddCircle
  164.           p
  165.           (/ $globle_dradius 2.)
  166.         )
  167.         ;;(xdrx_circle_make p (/ $globle_dradius 2.))
  168.         (drawscircle
  169.           p
  170.           (/ $globle_sradius 2.)
  171.           (math:dtr $globle_angle)
  172.           $globle_num
  173.         )
  174.       )
  175.     )
  176.   )
  177.   (princ)
  178. )

  179. ;;============================================
  180. (defun math:rtd (n) (* (/ n pi) 180.))
  181. (defun math:dtr (n) (* (/ n 180.) pi))
  182. ;;清空 errtile 控件显示
  183. (defun DCL:RsError () (set_tile "error" ""))
  184. ;;设置 errtile 控件 文字
  185. ;;var ----- string
  186. (defun DCL:SetError (val)
  187.   (dcl:RsError)
  188.   (set_tile "error" val)
  189. )
  190. ;;检查输入格式(数字)
  191. ;;input  ---- $value
  192. ;;format ---- string
  193. ;;kk     ---- key
  194. (defun DCL:CheckIn (input format kk /)
  195.   (if (and (distof input 2) (> (atof input) 0))
  196.     (progn (dcl:RsError) input)
  197.     (progn
  198.       (dcl:SetError (strcat "无效的" format "输入"))
  199.       (mode_tile kk 2)
  200.       nil
  201.     )
  202.   )
  203. )
  204. (defun DCL:ChkNumIn (kl /)
  205.   (mapcar '(lambda (x)
  206.              (action_tile x (strcat "(dcl:checkin $value \"数字\" " x))
  207.            )
  208.           kl
  209.   )
  210. )
  211. ;;将DCL表写出文件
  212. (defun DCL:Make        (lst / flname ofile)
  213.   (setq        FlName (vl-filename-mktemp (strcat "FYDCL" ".dcl"))
  214.         oFile  (open FlName "w")
  215.   )
  216.   (foreach fStream lst (write-line fStream oFile)) ;写入文件
  217.   (close oFile) ;_关闭文档
  218.   flname
  219. )
  220. ;;加载 DCL 文件
  221. (defun DCL:Load        (flname na / id)
  222.   (setq id (load_dialog FlName))
  223.   (if (not (new_dialog na id ""))
  224.     (progn (alert "对话框加载失败!") (exit))
  225.   )
  226.   id
  227. )
  228. ;;显示对话框
  229. (defun dcl:start (id flname / dg)
  230.   (setq dg (start_dialog))
  231.   (unload_dialog id) ;_卸载对话框
  232.   (vl-file-delete FlName) ;_删除DCL文件  
  233. )
  234. ;;获取 控件 值
  235. ;;lst ---- key list
  236. (defun DCL:Gettile (lst)
  237.   (mapcar '(lambda (x)
  238.              (get_tile x)
  239.            )
  240.           lst
  241.   )
  242. )
  243. ;;批量设置控件值
  244. ;;kl  ------ key list
  245. ;;pl  ------ list
  246. (defun DCL:Settile (kl pl)
  247.   (mapcar '(lambda (x y)
  248.              (set_tile x y)
  249.            )
  250.           kl
  251.           pl
  252.   )
  253. )

点评

Free-Lancer大师,非常感谢! 还差一点点,绘制的大圆也属于“中心线”图层,要怎样改呢?  详情 回复 发表于 2014-9-7 22:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2014-9-7 11:52:30 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-9-7 12:06 编辑

试试i这个,绘制实体和旋转拷贝用了 xdrxapi
  1. (mapcar        '(lambda (x y)
  2.            (if (not x)
  3.              (setq x y)
  4.            )
  5.          )
  6.         '($globle_dradius $globle_sradius $globle_num $globle_angle)
  7.         '(30. 10. 6 30.)
  8. )
  9. (setq mat0 (xdrx_matrix_identity))
  10. (defun c:tt (/               actionkey dopick           doaccept  drawscircle
  11.              getinput  strl         $keyinput fn             id
  12.              p               lst
  13.             )
  14.   ;;手动输入
  15.   (defun actionkey (kl)
  16.     (mapcar
  17.       '(lambda (x)
  18.          (action_tile
  19.            x
  20.            "(set (read (strcat \"$globle_\" $key ))(distof $value))"
  21.          )
  22.        )
  23.       kl
  24.     )
  25.   )
  26.   ;;点击拾取
  27.   (defun dopick        (key)
  28.     (if        (= key "apick")
  29.       (setq $keyinput 1)
  30.       (setq $keyinput 0)
  31.     )
  32.     (done_dialog)
  33.   )
  34.   ;;点击确定
  35.   (defun doaccept ()
  36.     (setq lst (dcl:gettile '("dradius" "sradius" "angle" "num")))
  37.     (done_dialog)
  38.   )
  39.   ;;绘制小圆
  40.   (defun drawscircle (p r an num / pc circle d ln mat an1 an0)
  41.     (setq pc         (polar p an (/ $globle_dradius 2))
  42.           circle (xdrx_circle_make pc r)
  43.           d         (* 1.2 r)
  44.           ln         (xdrx_line_make (polar pc an d) (polar pc (+ pi an) d))
  45.     )
  46.     (ssadd circle ln)
  47.     (setq an1 (/ (+ pi pi) num)
  48.           mat (xdrx_matrix_setrotation
  49.                 mat0
  50.                 an1
  51.                 '(0 0 1)
  52.                 p
  53.               )
  54.     )
  55.     (repeat (fix num)
  56.       (setq ln (xdrx_entity_transformedcopy
  57.                  ln
  58.                  mat
  59.                )
  60.       )
  61.     )
  62.   )
  63.   (defun getinput (/ dc an)
  64.     (if        (and (zerop $keyinput)
  65.              (setq
  66.                dc (getdist (strcat "\n大圆半径<"
  67.                                    (vl-princ-to-string $globle_dradius)
  68.                                    ">: "
  69.                            )
  70.                   )
  71.              )
  72.         )
  73.       (setq $globle_dradius dc)
  74.     )
  75.     (if        (and (= $keyinput 1)
  76.              (setq
  77.                an (getangle (strcat "\n偏转角度<"
  78.                                     (vl-princ-to-string $globle_angle)
  79.                                     ">: "
  80.                             )
  81.                   )
  82.              )
  83.         )
  84.       (setq $globle_angle (math:rtd an))
  85.     )
  86.   )
  87.   (setq        strl
  88.          '("temp:dialog {"
  89.            "    label = \"圆绘制\" ;"
  90.            "    :boxed_column {"
  91.            "     label =\"参数\" ;"
  92.            "        :row {"
  93.            "            :edit_box {   key = \"dradius\" ;  label = \"大圆直径\" ; }"
  94.            "           :button { key = \"dpick\" ; label = \"拾取\" ;  width = 8 ; }"
  95.            "       }"
  96.            "      :row {"
  97.            "          :edit_box { key = \"angle\" ; label = \"偏转角度\" ; }"
  98.            "           :button { key = \"apick\" ; label = \"拾取\" ; width = 8 ;}"
  99.            "      }"
  100.            "     :row {"
  101.            "          :edit_box { key = \"sradius\" ; label = \"小圆直径\" ;}"
  102.            "          :edit_box { key = \"num\" ;  label = \"数量\" ; }"
  103.            "      }"
  104.            "  }"
  105.            "   ok_cancel;"
  106.            "   errtile;"
  107.            "}"
  108.           )
  109.   )
  110.   ;;Main program
  111.   (setq        fn (dcl:make strl) ;_写出DCL
  112.         id (dcl:load fn "temp") ;_加载DCL
  113.   )
  114.   (dcl:settile
  115.     '("dradius" "sradius" "angle" "num")
  116.     (mapcar 'vl-princ-to-string
  117.             (list $globle_dradius
  118.                   $globle_sradius
  119.                   $globle_angle
  120.                   $globle_num
  121.             )
  122.     )
  123.   ) ;_设置默认值
  124.   (dcl:chknumin '("dradius" "sradius" "angle" "num")) ;_检查输入格式
  125.   (actionkey '("dradius" "sradius" "angle" "num")) ;_手动输入时记录变量
  126.   (mapcar '(lambda (x) (action_tile x "(dopick $key)"))
  127.           '("dpick" "apick")
  128.   ) ;_点取拾取按钮后进入命令行模式
  129.   (action_tile "accept" "(doaccept)") ;_点击确定直接进入绘图
  130.   ;;主程序
  131.   (dcl:start id fn) ;_start dialog
  132.   (if (or $keyinput lst) ;_点击确定或者点拾取后继续
  133.     (progn
  134.       (if lst
  135.         (mapcar
  136.           'set
  137.           '($globle_dradius $globle_sradius $globle_angle $globle_num)
  138.           (mapcar 'read lst)
  139.         )
  140.         (getinput)
  141.       )
  142.       (while (setq p (getpoint "\n中心点: "))
  143.         (xdrx_circle_make p (/ $globle_dradius 2.))
  144.         (drawscircle
  145.           p
  146.           (/ $globle_sradius 2.)
  147.           (math:dtr $globle_angle)
  148.           $globle_num
  149.         )
  150.       )
  151.     )
  152.   )
  153.   (princ)
  154. )
  155. ;;============================================
  156. (defun math:rtd        (n)
  157.   (* (/ n pi) 180.)
  158. )
  159. (defun math:dtr        (n)
  160.   (* (/ n 180.) pi)
  161. )
  162. ;;清空 errtile 控件显示
  163. (defun DCL:RsError ()
  164.   (set_tile "error" "")
  165. )
  166. ;;设置 errtile 控件 文字
  167. ;;var ----- string
  168. (defun DCL:SetError (val)
  169.   (dcl:RsError)
  170.   (set_tile "error" val)
  171. )
  172. ;;检查输入格式(数字)
  173. ;;input  ---- $value
  174. ;;format ---- string
  175. ;;kk     ---- key
  176. (defun DCL:CheckIn (input format kk /)
  177.   (if (and (distof input 2) (> (atof input) 0))
  178.     (progn (dcl:RsError) input)
  179.     (progn
  180.       (dcl:SetError (strcat "无效的" format "输入"))
  181.       (mode_tile kk 2)
  182.       nil
  183.     )
  184.   )
  185. )
  186. (defun DCL:ChkNumIn (kl /)
  187.   (mapcar '(lambda (x)
  188.              (action_tile x (strcat "(dcl:checkin $value \"数字\" " x))
  189.            )
  190.           kl
  191.   )
  192. )
  193. ;;将DCL表写出文件
  194. (defun DCL:Make (lst / flname ofile)
  195.   (setq        FlName (vl-filename-mktemp (strcat "FYDCL" ".dcl"))
  196.         oFile  (open FlName "w")
  197.   )
  198.   (foreach fStream lst (write-line fStream oFile)) ;写入文件
  199.   (close oFile) ;_关闭文档
  200.   flname
  201. )
  202. ;;加载 DCL 文件
  203. (defun DCL:Load (flname na / id)
  204.   (setq id (load_dialog FlName))
  205.   (if (not (new_dialog na id ""))
  206.     (progn (alert "对话框加载失败!") (exit))
  207.   )
  208.   id
  209. )
  210. ;;显示对话框
  211. (defun dcl:start (id flname / dg)
  212.   (setq dg (start_dialog))
  213.   (unload_dialog id) ;_卸载对话框
  214.   (vl-file-delete FlName) ;_删除DCL文件  
  215. )
  216. ;;获取 控件 值
  217. ;;lst ---- key list
  218. (defun DCL:Gettile (lst)
  219.   (mapcar '(lambda (x)
  220.              (get_tile x)
  221.            )
  222.           lst
  223.   )
  224. )
  225. ;;批量设置控件值
  226. ;;kl  ------ key list
  227. ;;pl  ------ list
  228. (defun DCL:Settile (kl pl)
  229.   (mapcar '(lambda (x y)
  230.              (set_tile x y)
  231.            )
  232.           kl
  233.           pl
  234.   )
  235. )
20140907120453.jpg

点评

谢谢Free-Lancer 大师,感谢您的再次帮助, 能不能脱离API呢?用您的app.fas函数,主要是API更新 公司的电脑拷贝文件进出比较麻烦,请您理解! 另外,中心线用'中心线'图层,关于此图层是否存在,这  详情 回复 发表于 2014-9-7 19:17

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-7 14:06:53 | 显示全部楼层
你不用API,我就不写了。

帮别的朋友问你下:

有均布数后,还用偏移角度吗? 你的工作不是都从0度角开始均布?

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-9-7 14:12:49 来自手机 | 显示全部楼层
本帖最后由 csharp 于 2014-9-7 14:14 编辑

从0度使用偏移夹角后整体不一定对称,只有偶数才对称
2/3篇幅是处理输入数据

点评

所以得问问他 如果有起始偏角后,均布后,那么第一个起始偏角的小圆,在都画完后,不一定是起始角后的第一个圆。 这样就容易照成模糊了。 不知道他做什么工作的,是否工作中的 都是 均布对称的。  详情 回复 发表于 2014-9-7 16:38

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-7 16:38:51 | 显示全部楼层
csharp 发表于 2014-9-7 14:12
从0度使用偏移夹角后整体不一定对称,只有偶数才对称
2/3篇幅是处理输入数据

所以得问问他

如果有起始偏角后,均布后,那么第一个起始偏角的小圆,在都画完后,不一定是起始角后的第一个圆。 这样就容易照成模糊了。

不知道他做什么工作的,是否工作中的 都是 均布对称的。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-9-7 17:01:24 来自手机 | 显示全部楼层
应该简化简化对话框输入和控制,大量的是简单界面,没有关联
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-7 19:17:11 | 显示全部楼层
Free-Lancer 发表于 2014-9-7 11:52
试试i这个,绘制实体和旋转拷贝用了 xdrxapi

谢谢Free-Lancer 大师,感谢您的再次帮助,{:soso_e160:}
能不能脱离API呢?用您的app.fas函数,主要是API更新 公司的电脑拷贝文件进出比较麻烦,请您理解!
另外,中心线用'中心线'图层,关于此图层是否存在,这一点不用担心。
对话框初次绘制时有个默认值,而不是nil

以上,谢谢!!!

点评

就替换几句话而已  详情 回复 发表于 2014-9-7 22:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-7 22:14:46 | 显示全部楼层
Free-Lancer 发表于 2014-9-7 22:01
就替换几句话而已

Free-Lancer大师,非常感谢!
还差一点点,绘制的大圆也属于“中心线”图层,要怎样改呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2014-9-7 22:21:35 | 显示全部楼层
lucas3 发表于 2014-9-7 22:14
Free-Lancer大师,非常感谢!
还差一点点,绘制的大圆也属于“中心线”图层,要怎样改呢?


  1. (while (setq p (getpoint "\n中心点: "))
  2.         (vla-put-layer
  3.           (vlax-invoke
  4.             (fy:acspace)
  5.             'AddCircle
  6.             p
  7.             (/ $globle_dradius 2.)
  8.           )
  9.           "中心线"
  10.         )
  11.         (drawscircle
  12.           p
  13.           (/ $globle_sradius 2.)
  14.           (math:dtr $globle_angle)
  15.           $globle_num
  16.         )
  17.       )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-7 22:46:35 | 显示全部楼层
再次感谢Free-Lancer大师!晓东有您更精彩!{:soso_e178:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-9-8 02:19:46 | 显示全部楼层
st788796 发表于 2014-9-7 23:46
再体会体会 ODCL 用法(ODCL 8.0 以上),参数获取用 非模态对话框 ,点击绘图自动关闭对话框,同时分开写还 ...

必须用ODCL 8.0以上版本吗? 8.0以上有什么新的东西?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-25 13:26 , Processed in 0.455189 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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