QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3886|回复: 12
收起左侧

[讨论] 直线相交 断开

[复制链接]
发表于 2008-2-19 05:40:50 | 显示全部楼层 |阅读模式 来自: 中国辽宁鞍山

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
发表于 2008-2-19 07:48:51 | 显示全部楼层 来自: 中国江苏南京
管线相交时,怎么也不会自行断开,只有用打断命令,执行打断才行!
发表于 2008-2-19 11:04:46 | 显示全部楼层 来自: 中国山西运城
使用打断命令或裁剪,然后在COPY就好了
发表于 2008-2-19 11:07:48 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
1 J# S; Y" |9 h9 R: }
. ?! G9 x: D% Z5 g基本凭感觉打断
发表于 2008-6-29 13:06:12 | 显示全部楼层 来自: 中国浙江宁波
你可以用lisp试试看,方法是选择交点,输入水平或垂直方向,再调用两点打断命令,可以程序控制断开的间隙,系统图一般在断开后还要绘制半圆弧跳过,亦即在水平或垂直方向绘制半圆,圆的直径为断开处的间隙大小;

评分

参与人数 1三维币 +3 收起 理由
wsj249201 + 3 技术讨论

查看全部评分

发表于 2008-6-29 13:15:14 | 显示全部楼层 来自: 中国河南安阳
原帖由 maoyangmy 于 2008-2-19 05:40 发表 http://www.3dportal.cn/discuz/images/common/back.gif
" X% y$ m9 `+ u6 |. G我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
! ~* b) e+ y. I5 x7 r0 a

6 R1 A3 N2 H& J% N据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:7 e' \; j3 x  e0 ]
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化# k& W4 U( X2 n, Z
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序3 A9 j5 ^- K5 d+ G% b8 O+ [0 W

5 }( _2 c- K3 G# x# S- r1 O(DEFUN C:HD()  Y' W6 k3 Y5 L& d( \* S; n
(SETVAR "OSMODE" 32)
  j8 e: ]- o% W( H( @(SETQ a (getpoint "\n Select intersection to break: "))
( A; x. |6 O, F5 o6 \(setq x (car a))
% `5 _  Y. f# B$ R- R(setq y (cadr a))
; H) }) O6 X- l( ]' @9 a) S(command "break" (list (- x 2) y) "@4,0" "@4,0")
% e" n; `+ X* E& E( M. @8 Q(SETVAR "OSMODE" 231)
0 Z" u1 ?! }. ]8 \+ w! {)
: P; n1 k2 G: V' F0 y3 W/ \# H  A  b: t- B0 n& u3 K  G
断开距离为两边各2,如果需要距离加大,可自行修改
发表于 2008-6-30 10:28:11 | 显示全部楼层 来自: 中国四川成都
在交点上画个圆.剪.
发表于 2008-6-30 10:33:16 | 显示全部楼层 来自: 中国河南安阳
原帖由 maoyangmy 于 2008-6-29 20:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
# J& D7 N% b* t8 i' ^相交线横断程序
5 s  \# s) D+ p- o0 w, R2 U2 P1 W# G( k
(DEFUN C:HD()
6 F, n! ?( @7 _(SETVAR "OSMODE" 32)
; R! Z  s8 n. T4 e, v) U1 S(SETQ a (getpoint "\n Select intersection to break: &quot)9 Y! `; |8 Y6 e7 H
(setq x (car a)), i; j4 `9 i- R1 q. _0 \6 F0 U. w
(setq y (cadr a))
& Q; I0 s5 B. |' m(command "break" (list (- x 2) y) "@4,0" "@4,0")$ w! v  [8 \" u+ z) Z$ N$ l
(SETVAR "OSMODE" 231), M' I5 l& h0 F. S6 t( H' q& `( y
)
( N# g* D" l5 T) n! }$ U$ P$ L) u$ R6 y$ h. \
断开距离为两边各2,如果需要距离加大,可自行修改

" `- g" A4 y) n
% E8 \$ ^7 k% X3 m' `1 G$ L楼主同志
) C1 v: X$ a, l( D+ Z看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人0 U  s6 R- R  C0 e' [

$ I' R% J. p! ?$ k* y/ G: L. x' p( I% _: H9 K
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:% i  q4 Z6 M+ k# {
9 m' X+ }$ D' @! K
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★( d$ r% I0 r  Q9 \1 u
% ~+ ^% |% R- Z
9 l! M! ^# R9 ~
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
6 m4 x9 _1 W; N$ }0 ~
+ n* ^0 F$ q+ r7 H  H: e' F% S: |
* a. I7 C% ~- a5 {% T- r+ S- K1 y
我默默的点头titter
, m3 I( ]( I! C( b7 Q& }
* S% w: L- z  p8 I楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake
) q  h3 m; d# [* K# l& D8 ?. d+ m4 m3 ?+ L9 w, y

1 u  t2 L! w  ?# l  W; s5 K8 a(DEFUN C:HD()8 U" ^/ X/ h) M
这一行是在定义一个命令“HD”/ M' [) c- |2 W: [- W7 V$ `. I
(SETVAR "OSMODE" 32)
& h) `! G, ?7 Y" w9 r
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
9 r" K/ r' W& I" {/ `(SETQ a (getpoint "\n Select intersection to break: "))
& W- q8 F$ y/ T- V( P% j" l" s7 f

* F" \0 G. R) p) w* B4 L- J这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )5 k* }% d" @  U: B
(setq x (car a)): j0 Q5 w# A/ b; C
提取a点的X坐标,取名“x”4 t3 d. Y. ~, A, o! ?! H2 T/ E2 ]
(setq y (cadr a))
6 `# j3 m$ ~) q' A1 Y
提取a点的Y坐标,取名“y”
; G9 J- w6 B# W(command "break" (list (- x 2) y) "@4,0" "@4,0")
" o7 D% H2 t3 U9 e: @' W9 S5 m; ~
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车8 x$ D9 L# x2 A; ]$ H/ y3 U
(SETVAR "OSMODE" 231)
' g. o. r3 O3 M/ z
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足, Z6 ^% i$ r' b( a- y# B6 d+ g
)8 I, |5 s* ?9 J+ G) p1 F" t
程序结束3 U" P# Y8 {4 H3 d0 S8 S( i  c
$ e6 b3 S8 c. e9 k3 L
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
. ^8 i5 _- @9 V分析一下程序可以看出:让你见笑了:handshake
0 d- g* N  B4 Y& s3 I# a* S. X
" j) h6 i; V: ?4 I/ d( N
1 @6 M  Z. R; s* S3 w1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )
- A* b: e4 q: k3 Y  L2(command "break" (list (- x 2) y) "@4,0" "@4,0")这一行问题多多。首先,调用"break"命令,当命令行提示选择对象时在a点左侧2个图形单位处指定点会出现意外。举个例子,在图上先画一条水平直线,再画一条垂直直线与水平直线相交(此时垂直直线绘图顺序在上),当视图缩得比较小而拾取框比较大,a点左侧2个图形单位处拾取框能同时覆盖两个对象时,CAD会选择垂直直线而不是水平直线打断;再举个例子,在图上画两条倾斜的相交直线,把视图放得很大,a点左侧2个图形单位处拾取框不能覆盖对象时,CAD会找不到对象,程序执行完了,CAD还在提示选择对象。其次,第一个"@4,0"的用处原本是在拾取框右侧4个图形单位处设置第二个打断点,但实际使用中如果视图缩得比较小,对象捕捉会捣乱,把"@4,0"点改到交点上。最后,第二个"@4,0"完全是多余的。(看看我这智商特低,理解对吗?% B1 n* t+ l) }( y, h0 R' f) T* G& J+ L

7 T0 {8 {! T- }; x, R: `! i0 K8 O( u

- w& ^8 }5 H) s' a★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
" A7 h# h8 q0 {! L( ^
, ?: c0 @  h; F' Z3 k6 l% X6 ^& C% c: f0 e1 b  w
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: / |; s2 q8 u9 Z7 m4 t3 z
7 y6 A, y. e8 C5 o2 y
- x" z& e8 `3 w& ?3 F; p: {5 [% ^; r
- I9 X2 [& }7 m- P! j
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。% N$ H* i( b) k1 c7 M0 w. R
2、修改后的程序:
  x# n1 B* D# f+ T# p4 {0 _(DEFUN C:HD()% Y) z; V& U# W+ L  @/ u9 n1 Y
(setq b(getvar "osmode"))
* `) _9 o+ Q, q1 F
(SETVAR "OSMODE" 32)
" M- d  D! c/ O3 I& U% |(SETQ a (getpoint "\n Select intersection to break: "))
- E- Y4 W$ d, g4 L" y, }/ N' X
(SETVAR "OSMODE" 0)
8 f: K+ H. }: O3 d(command "break" a "f" "@-2,0" "@4,0")

/ f2 S' B2 I. K6 V9 w(SETVAR "OSMODE" b)% d7 i7 b0 G8 @# A7 R
)
+ a' t" }9 m3 s* ^5 l; ^8 j0 Q, B% W6 y& c: [! n1 {
把这个程序翻译成白话& w2 a7 M: H5 I, s& r3 q
(DEFUN C:HD()
2 ]  N% k* T% U, i2 \" c/ E
定义一个命令“HD”! k. x, }$ C# M' p" Y8 A$ f9 \- q
(setq b(getvar "osmode"))
( w; h5 t* ~+ |; w1 e$ B5 v
把使用者原来的对象捕捉设置保存为b3 }+ p1 I- _) r4 w
(SETVAR "OSMODE" 32)
" D1 q  A% [) u
修改对象捕捉交点! u9 c' K' N: s, W
(SETQ a (getpoint "\n Select intersection to break: "))
4 A+ L7 u: u0 F9 b
在屏幕上指定交点) U+ y6 o( n/ |' n8 m1 X' Z
(SETVAR "OSMODE" 0)
7 x/ ]0 b- g6 J' W3 t
取消对象捕捉* ~' R9 Q8 C: Z" d
(command "break" a "f" "@-2,0" "@4,0")- t8 T; W7 Z1 E/ L+ c" E8 A
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。6 W/ e2 L' Y& T
(SETVAR "OSMODE" b)0 \4 i! ~6 m' Y& W+ r
恢复使用者原来的对象捕捉设置4 x/ O9 G, ^9 G
)2 Y' W2 V9 j0 ~/ S: |
程序结束
; K9 `) X! Y8 [9 A8 P& b5 I. c
over
9 Z, ^+ U* Z* H0 u/ X' g" j" P6 x  x
# Q+ M0 d% p4 `5 T0 F6 {: x9 A
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
' r7 X% y% [7 L8 ^那版主給加幾分呀
) ^! G4 Y( g: W^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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