明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5598|回复: 32

[求助]

  [复制链接]
发表于 2003-4-15 13:26:00 | 显示全部楼层 |阅读模式
以下是小第编制的的程序,调用视图时,有时能正确显示,有时候会出现错误的图形。
不知道为什么。
dialjlm:dialog{
        label="连接螺母";
        :boxed_row{
                label="视图";
                :text{label="主视图";alignment=centered;}
                :image_button {
                        key = "kimage1";
                        color = -2;
                        width = 30;
                        aspect_ratio = 0.66;
                        allow_accept = true;
                        }
                :text{label="左视图";alignment=centered;}
                :image_button {
                        key = "kimage2";
                        color = -2;
                        width = 30;
                        aspect_ratio = 0.66;
                        allow_accept = true;
                        }
                }
        :boxed_row{
                label="参数设计相关尺寸";
                :edit_box{label="d";key="kd";edit_width=8;}
                :popup_list{key="popd";edit_width=8;}
               
        }
        spacer_1;
        ok_cancel;
}

以上是对话框程序
以下是lisp程序
(defun c:dialjlm()
   (setvar "cmdecho" 0)
   (setvar "osmode" 0)  
   (dcl_dialjlm)
   (prin1)
)
(defun dcl_dialjlm()
   (setq dcl_id (load_dialog "dialjlm"))
   (new_dialog "dialjlm" dcl_id)   
   (def_dialjlm)
   (action_tile "popd" "(setq pop 1)(sub_pop $value)")
   (action_tile "kimage1" "(setq ddtype 1)")
   (action_tile "kimage2" "(setq ddtype 2)")
   (action_tile "accept" "(ok_dialjlm)(done_dialog 1)")
   (setq dd(start_dialog))
   (if (= dd 1)
       (draw_dialjlm)
   )
)
(defun def_dialjlm()
   (set_tile "kd" "12")
   (setq sldkey_list '("kimage1" "kimage2"))
   (setq sld_list    '("dialjlm2" "dialjlm1"))
   (mapcar 'show_sld sldkey_list sld_list)
   (setq d_list    '("12" "16" "20" "24" "30" "36" "42" "48"))
   (show_list "popd" d_list)
   (setq ddtype 1)
   (mode_tile "kimage1" 2)
)
(defun show_list(key newlist)
   (start_list key)
   (mapcar 'add_list newlist)
   (end_list)
)

(defun sub_pop(vvs)
   (if (= pop 1)
       (set_tile "kd" (nth (atoi vvs) d_list))
   )
   
)

(defun show_sld(key sld)
   (setq x (dimx_tile key))
   (setq y (dimy_tile key))
   (start_image key)
   (fill_image 0 0 x y -2)
   (slide_image 0 0 x y sld)
   (end_image)
)
(defun ok_dialjlm()
   (setq d (atof (get_tile "kd")))
)
(defun sub_chk_layer()
   (setq chklay (tblsearch "layer" "str"))
   (if (= chklay nil)
       (command "layer" "n" "str" "c" "7" "str" "")
   )
   (setq chklay (tblsearch "layer" "txt"))
   (if (= chklay nil)
       (command "layer" "n" "txt" "c" "6" "txt" "")
   )
   (setq chklay (tblsearch "layer" "dim"))
   (if (= chklay nil)
       (command "layer" "n" "dim" "c" "5" "dim" "")
   )
   (setq chklay (tblsearch "layer" "hat"))
   (if (= chklay nil)
       (command "layer" "n" "hat" "c" "3" "hat" "")
   )
   (setq chklay (tblsearch "layer" "cen"))
   (if (= chklay nil)
       (command "layer" "n" "cen" "c" "1" "cen" "lt" "center" "cen" "")
   )
   (setq chklay (tblsearch "layer" "hid"))
   (if (= chklay nil)
       (command "layer" "n" "hid" "c" "2" "hid" "lt" "hidden" "hid" "")
   )
  )
  (defun cen()
    (command "layer" "s" "cen" ""))
  (defun hid()
    (command "layer" "s" "hid" ""))
  (defun str()
    (command "layer" "s" "str" ""))
  (defun txt()
    (command "layer" "s" "txt" ""))
  (defun dim()
    (command "layer" "s" "dim" ""))
  (defun hat()
    (command "layer" "s" "hat" ""))
(defun draw_dialjlm()
  (setq r (* 0.5 d))
  (setq d1 (* 0.9 d))
  (setq r1 (* 0.5 d1))
  (cond ((= d 12) (setq l 40) (setq q 21.9) (setq s 19))
        ((= d 16) (setq l 50) (setq q 27.7) (setq s 24))
        ((= d 20) (setq l 60) (setq q 34.6) (setq s 30))
        ((= d 24) (setq l 75) (setq q 41.6) (setq s 36))
        ((= d 30) (setq l 90) (setq q 53.1) (setq s 46))
        ((= d 36) (setq        l 110) (setq q 63.5) (setq s 55))
        ((= d 42) (setq l 130) (setq q 75) (setq s 65))
        ((= d 48) (setq l 160) (setq q 85.5) (setq s 75))
        (t (princ "\n没有此值"))
  )       
  (setq r2 (- (* 1.5 d) (sqrt (- (* 2.25 d d) (* 0.25 q q)))))
   ;以下依据不同的类别,调用不同的绘图模式
(cond ((= ddtype 1) (setvar "osmode" 0)
                     (setq pa (getpoint "请输入基点:"))
                     (setq po1 (polar pa pi 4))
                     (setq po2 (polar pa 0 (+ l 4)))
                     (setq pb (polar pa 0 (* 1.5 d)))
                     (setq pc (polar pa 0 r2))
                     (setq pd (polar pc (/ pi 2) (* 0.25 (+ q d))))
                     (setq pe (polar pa 0 (/ l 2)))
                     (setq px1 (polar po1 (/ pi 2) (/ d 2)))
                     (setq px2 (polar pe (/ pi 2) (/ d 2)))
                     (setq px3 (polar po1 (/ pi 2) (/ q 2)))
                     (setq px4 (polar pe (/ pi 2) (/ q 2)))
                     (setq px5 (polar pa (/ pi 2) (* 0.25 (+ q d))))
                     (sub_chk_layer)
                     (cen)
                     (command  "line" po1 po2 "")
                     (str)
                     (command "line" px1 px2 "")
                     (command "line" px3 px4 "")
                     (command "line" pa px5 "")
                     (command "circle" pb (* 1.5 d))
                     (command "circle" pd r2)
                     (command "trim" pb "" (polar pb (* 1.25 pi) (* 1.5 d)) "")
                     (command "trim" px2 "" (polar pb (* 0.25 pi) (* 1.5 d)) "")
                     (command "trim" px4 "" (polar pd (/ pi 2) r2) "")
                     (command "trim" px2 "" (polar pd (* pi 1.5) r2) "")
                     (command "erase" (polar pd 0 r2) "")
                     (command "trim" (polar pd (* 0.85 pi) r2) "" px1 px3 "")
                     (setq ss (ssget "w" px3 pe))
                     (command "mirror" ss "" px2 px4 "")
                     (setq ss (ssget "w" px3 (polar pa 0 l)))
                     (command "mirror" ss "" pa pe "")
                     )
       ((= ddtype 2) (setq pt (getpoint "请输入基点:"))
                     (setq pt1 (polar pt pi (* 0.6 D)))
                     (setq pt2 (polar pt 0 (* 0.6 D)))
                     (setq pt3 (polar pt (/ pi 2) (* 0.6 D)))
                     (setq pt4 (polar pt (* 1.5 pi) (* 0.6 D)))
                     (setq pt5 (polar pt 0 r))
                     (setq pt6 (polar pt (* 1.5 pi) r))
                     (sub_chk_layer)
                     (cen)
                     (command "line" pt1 pt2 "")
                     (command "line" pt3 pt4 "")
                     (hat)
                     (command "arc" "ce" pt pt5 pt6)
                     (str)
                     (command "circle" pt r1)
                     (command "circle" pt (* 0.5 s))
                     (command "polygon" 6 pt "c" (* 0.5 s))
        )
    )                 
)

就是以下这段绘图程序老是出错,有时候是正确的图形,有时候是错误
cond ((= ddtype 1) (setvar "osmode" 0)
                     (setq pa (getpoint "请输入基点:"))
                     (setq po1 (polar pa pi 4))
                     (setq po2 (polar pa 0 (+ l 4)))
                     (setq pb (polar pa 0 (* 1.5 d)))
                     (setq pc (polar pa 0 r2))
                     (setq pd (polar pc (/ pi 2) (* 0.25 (+ q d))))
                     (setq pe (polar pa 0 (/ l 2)))
                     (setq px1 (polar po1 (/ pi 2) (/ d 2)))
                     (setq px2 (polar pe (/ pi 2) (/ d 2)))
                     (setq px3 (polar po1 (/ pi 2) (/ q 2)))
                     (setq px4 (polar pe (/ pi 2) (/ q 2)))
                     (setq px5 (polar pa (/ pi 2) (* 0.25 (+ q d))))
                     (sub_chk_layer)
                     (cen)
                     (command  "line" po1 po2 "")
                     (str)
                     (command "line" px1 px2 "")
                     (command "line" px3 px4 "")
                     (command "line" pa px5 "")
                     (command "circle" pb (* 1.5 d))
                     (command "circle" pd r2)
                     (command "trim" pb "" (polar pb (* 1.25 pi) (* 1.5 d)) "")
                     (command "trim" px2 "" (polar pb (* 0.25 pi) (* 1.5 d)) "")
                     (command "trim" px4 "" (polar pd (/ pi 2) r2) "")
                     (command "trim" px2 "" (polar pd (* pi 1.5) r2) "")
                     (command "erase" (polar pd 0 r2) "")
                     (command "trim" (polar pd (* 0.85 pi) r2) "" px1 px3 "")
                     (setq ss (ssget "w" px3 pe))
                     (command "mirror" ss "" px2 px4 "")
                     (setq ss (ssget "w" px3 (polar pa 0 l)))
                     (command "mirror" ss "" pa pe "")
                     )
发表于 2003-4-15 14:31:00 | 显示全部楼层

一点建议,,

首先不能确定你说的错误指的是什么,怎样的结果是正确的。不过有些时候程序运行会出一些以外的结果。

比如输入的D不是你列举的几个内容,程序就会出错,这有两个问题,一是如果输入错误的数值,程序出错退出,二是继续运行,但结果却不对。所以这里建议你在输入时限制输入,就象右边那样只能选择,或在输入了错误数据后做出动作(比如说推出,或重新输入),而不是打印一句“没有此值”还继续执行程序。还有就是所有变量建议使用局部变量,有变量传递时,采用参数传递
 楼主| 发表于 2003-4-15 15:24:00 | 显示全部楼层

关于图形正确与否

我指的图形正确是指和对话框内的幻灯片的图形一致,错误是指出现与对话框内图形不一致。
我这段程序也采用限制输入,只能输入所列举的d值
发表于 2003-4-15 15:54:00 | 显示全部楼层

你不给幻灯片,我怎么知道对错啊

 楼主| 发表于 2003-4-15 16:13:00 | 显示全部楼层

幻灯片

大侠,这是我的所有程序和幻灯片的压缩包,
 楼主| 发表于 2003-4-15 16:17:00 | 显示全部楼层

程序以及幻灯片压缩包

还请大侠好好帮忙。

本帖子中包含更多资源

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

x
发表于 2003-4-15 16:32:00 | 显示全部楼层

大概看了一下,应该是TRIM命令的问题

使用TRIM时,由于显示比例的不同,选择的实体会出现偏差,导致结果的错误。建议利用其计算功能,算出各点,使用各种作图命令直接画,而不要画多余的线条。
 楼主| 发表于 2003-4-15 16:42:00 | 显示全部楼层

有没有别的方法

我有两点没办法计算,只能用trim命令修剪,
有没有别的办法
发表于 2003-4-15 16:49:00 | 显示全部楼层

不可能,只要图是确定的,就能算出任何点。在画图是尽量将图放大,好象很少出错

 楼主| 发表于 2003-4-15 16:52:00 | 显示全部楼层

谢谢!

谢谢大侠!那我再试试看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 09:33 , Processed in 0.201936 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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