明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cabinsummer

[【风之影】] [新手源码指导]建库程序,以轴承为例

  [复制链接]
 楼主| 发表于 2012-4-28 05:45:45 来自手机 | 显示全部楼层
村夫做的太好了
 楼主| 发表于 2012-4-28 21:15:08 | 显示全部楼层

优化村夫的GB283轴承的程序

本帖最后由 cabinsummer 于 2012-4-28 21:50 编辑

前面几个是通用函数
在画线部分用了LISP的表处理函数,使得程序的通用性加强。插入的为块。高手们尽管提意见,也希望新手们能学到新东西。读者可以根据这个将其它几个轴承画出来,然后找到共性的函数优化程序。

  1. (defun Addline (StartPoint EndPoint);;;直线
  2.   (entmake (list '(0 . "LINE")'(100 . "AcDbLine")(cons 10 StartPoint)(cons 11 EndPoint)))
  3. )
  4. (defun DefBlock ();;;定义无名块
  5.   (entmake '((0 . "BLOCK")(10 0.0 0.0 0.0)(70 . 1)(2 . "*U")))
  6. )
  7. (defun RefBlock (BlockName PNT);;;插入无名块
  8.   (entmake (list '(0 . "INSERT")(cons 2 BlockName)(cons 10 PNT)))
  9. )
  10. (defun C:GB283 (/ pt0 r1 r2 b0  a0 a1 a2 a3 ax aa px pntlist linelist)
  11.   (setq pt0 (getpoint "\n请指定滚轴轴承中心插入点: "))
  12.   (setq r1 (* 0.5 (getreal "\n输入轴承内径<d>: ")))
  13.   (setq r2 (* 0.5 (getreal "\n输入轴承外径<D>: ")))
  14.   (setq b0 (* 0.5 (getreal "\n输入轴承宽度<B>: ")))
  15.   (setq p0 '(0 0))
  16.   (setq a0 (- r2 r1))
  17.   (setq a1 (/ a0 2))
  18.   (setq a2 (/ a0 4))
  19.   (setq a3 (/ a0 8))
  20.   (setq ax (cos (/ pi 12)))
  21.   (setq aa (/ (- b0 a2) ax))
  22.   (setq px (list b0 (+ r1 a1)))
  23.   (setq p1 (list 0 r1))
  24.   (setq p2 (list (+ b0 b0) r1))
  25.   (setq p3 (polar p2 (/ pi 2) (* 3 a3)))
  26.   (setq p13 (polar p2 (* 0.5 pi) a0))
  27.   (setq p14 (list 0 r2))
  28.   (setq p4 (polar p3 pi (- b0 a2)))
  29.   (setq p5 (polar p4 (* 3 (/ pi 2)) a3))
  30.   (setq p6 (polar p5 pi a1))
  31.   (setq p7 (polar p6 (/ pi 2) a3))
  32.   (setq p8 (polar p7 pi (- b0 a2)))
  33.   (setq p10 (polar p6 (* 0.5 pi) a1))
  34.   (setq p11 (polar p10 0 a1))
  35.   (setq p12 (polar p11 (/ pi 12) aa))
  36.   (setq p9 (polar p10 (* (/ pi 12) 11) aa))
  37.   (setq p15 (polar px pi (+ 3 a2)))
  38.   (setq p16 (polar px 0 (+ 3 a2)))
  39.   (setq p17 (polar px (/ pi 2) (+ 3 a2)))
  40.   (setq p18 (polar px (* 3 (/ pi 2)) (+ 3 a2)))
  41.   (setq pntlist '(P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 P18));;;求对称点
  42.   (foreach x pntlist (set (read (strcat "N" (vl-princ-to-string x))) (list (car (eval x)) (- (cadr (eval x))))))
  43.   (DefBlock);;;无名块
  44.   (setq linelist '((P1 P2)(P3 P4)(P5 P6)(P7 P8)(P9 P10)(P10 P11)(P11 P12)(P13 P14)(P15 P16)(P17 P18)(P1 P14)(P2 P13)(P5 P11)(P6 P10)
  45.         (NP1 NP2)(NP3 NP4)(NP5 NP6)(NP7 NP8)(NP9 NP10)(NP10 NP11)(NP11 NP12)(NP13 NP14)(NP15 NP16)(NP17 NP18)(NP1 NP14)(NP2 NP13)(NP5 NP11)(NP6 NP10)
  46.   ))
  47.   (foreach x linelist (Addline (eval (car x))(eval (cadr x))));;;每一组点画线
  48.   (setq blockname (entmake '((0 . "ENDBLK"))))
  49.   (setq pntlist '(P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 P18));;;清空没有在局部变量中声明的变量
  50.   (foreach x pntlist (set (read (strcat "N" (vl-princ-to-string x))) nil)(set (read (vl-princ-to-string x)) nil))
  51.   (RefBlock blockname pt0);;;插入块到pt0点
  52.   (princ)
  53. )
发表于 2012-4-29 11:21:23 | 显示全部楼层
软件总是一点一点做起来的,一下子做个很全的库,没这个必要嘛
发表于 2012-4-29 14:36:40 | 显示全部楼层
那个深沟的就用276的吧?
 楼主| 发表于 2012-4-29 16:19:01 来自手机 | 显示全部楼层
chshsl 发表于 2012-4-29 11:21
软件总是一点一点做起来的,一下子做个很全的库,没这个必要嘛

你会在这个帖子里看到库是一点一点做起来的。本帖主要讲方法
发表于 2012-4-29 19:48:24 | 显示全部楼层
cabinsummer 发表于 2012-4-27 16:02
你学习什么?

学习库文件的做法与调用啊~~~
发表于 2012-4-29 20:50:44 | 显示全部楼层
学习优化中。。。
做块的话,好像多问一句块名较好,直接可将轴承代号录入,皆因输入数据时,基本上已知轴承代号。
这一组程序是初学时自己写给自己用的,有一段时间直接用下拉菜单方式调用GB276轴承代号,由于手册不全工作量太大放弃,现一直用3D方式。
这些程序变得没什么用处了。

点评

有名块简单,将组码70改为0,组码2改为块名即可,插入块时先用(tblsearch "BLOCK" blockname)现检索图形中是否已存在响应的块  发表于 2012-4-29 21:00
 楼主| 发表于 2012-4-30 09:54:51 | 显示全部楼层
本帖最后由 cabinsummer 于 2012-4-30 09:55 编辑

如果嫌画线段太多,可以考虑采用Polyline的方式
定义通用函数
  1. (defun AddPolyline (Tag) (entmake (list '(0 . "polyline")'(66 . 1)(cons 70 Tag))));;;多义线。Tag为1则为闭合多义线。
  2. (defun AddVertex (Point) (entmake (list '(0 . "vertex")(cons 10 Point))));;;多义线中的顶点,直线段
  3. (defun AddVertexa (Point rad) (entmake (list '(0 . "vertex")(cons 10 Point)(cons 42 rad))));;;多义线中的顶点,有圆弧段。若rad为0则为直线段,此时与前一函数作用相同

调用方法要先定义顶点表
  1. (setq vertexlist '(P1 P2 P3 P4));;;P*是实现计算出的点表
  2. (DefBlock);;;无名块
  3. (AddPolyline 0);;;添加多义线
  4. (foreach x linelist (AddVertex (eval x)));;;添加多义线顶点
  5. (entmake '((0 . "SEQEND")));;;多义线结束标志
  6. (setq blockname (entmake '((0 . "ENDBLK"))));;;块结束
  7. (RefBlock blockname pt0);;;插入块到pt0点

由于vertexlist可以任意定制,所以上面的程序具有很大的灵活性。
发表于 2012-5-1 10:10:00 | 显示全部楼层
最近没电脑用,临时做了个

本帖子中包含更多资源

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

x

点评

完成的不错  发表于 2012-5-1 19:45

评分

参与人数 2明经币 +1 金钱 +9 收起 理由
cabinsummer + 1
xyp1964 + 9 赞一个!

查看全部评分

 楼主| 发表于 2012-5-1 20:24:29 | 显示全部楼层
邹锋 发表于 2012-5-1 10:10
最近没电脑用,临时做了个

完成的不错!还有改进的余地。
对话框有幻灯,但是编辑框设计的不好。我建议采用列表框(非现在的弹出式列表框)。因为轴承属于标准件,往往是直接选用型号,而不是输入尺寸。采用列表框可以浏览更多的型号。把编辑框取消,改为文本提示。幻灯中的尺寸标识不要用H、D1,而采用习惯用法d、D、b表示。

程序中借用了sdwy196912的部分,没有创新。不过该部分本身也过于冗长,存在大量结构类似的内容,如:
(setq p25 (polar p17 (* pi 1.5) hy))
(setq p26 (polar p18 (* pi 1.5) hy))
(setq p27 (polar p19 (* pi 0.5) hy))
(setq p28 (polar p20 (* pi 0.5) hy))
(setq p29 (polar p21 (* pi 1.5) hy))
(setq p30 (polar p22 (* pi 1.5) hy))
(setq p31 (polar p23 (* pi 0.5) hy))
(setq p32 (polar p24 (* pi 0.5) hy))
完全可以按我32楼方式那样简化,而且有更大的适应性。尤其是画图部分更要有通用的函数结构,以便后期扩展。

值得提倡的一点是,把sdwy196912的尺寸标注部分取消了,说明还是有工作经验的。在实际工作中,轴承作为标准件一般出现在装配图中,没有象sdwy196912那样标轴承尺寸的,装配图中的标准件尺寸可以不标或者标配合公差。

建议再完善一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 15:12 , Processed in 0.170434 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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