QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
1天前
查看: 3895|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的" h! t: i: a. O

# O$ J& @! L% Z基本凭感觉打断
发表于 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% J+ s1 r& Y1 m1 N0 l) K3 _' l我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???

$ X6 x5 X. h$ P* m! W( c& o
) z! W  R5 K) ^4 u1 b' a( D1 o据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:
" b5 U# s/ x3 \6 C# O2 o如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化
) o. e5 H1 I+ y* l; j% X2 bCAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
/ ~2 V3 x3 v; Q- J8 V; r" k: g1 p1 C2 O  U0 X
(DEFUN C:HD()( }. O9 x& S1 E
(SETVAR "OSMODE" 32)& l& I5 ~4 Y2 T! g# E% `3 I
(SETQ a (getpoint "\n Select intersection to break: "))  [6 C& Y; A0 g) C$ g
(setq x (car a))
: E" M  Y5 j$ q/ y(setq y (cadr a))
8 c9 d4 A9 A7 w9 ]5 Y$ W+ C(command "break" (list (- x 2) y) "@4,0" "@4,0")
/ _8 \5 J- O6 @% E  G, a(SETVAR "OSMODE" 231)' p3 y* t+ H4 u' {, |+ u
)0 I$ o3 O# U& A1 B& ~0 }

; D& L7 l4 z. T  q断开距离为两边各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$ T6 F/ m2 [( J4 R& v1 K% A: V& F
相交线横断程序5 M7 ^& |: m! |  M9 B( I
) [1 p' [1 a2 s# i- m
(DEFUN C:HD()" ^, g3 R& Q( q) b+ @8 L# Y
(SETVAR "OSMODE" 32)6 W5 }" T( q& U; s9 ?
(SETQ a (getpoint "\n Select intersection to break: &quot)
( @  _. H- K5 Z% o; A: N- D(setq x (car a))
$ v( F9 i$ g5 E. g(setq y (cadr a))
! @; Y* ^( t9 \2 b(command "break" (list (- x 2) y) "@4,0" "@4,0")' j% ~& T' D6 B0 O( e( G$ R9 T
(SETVAR "OSMODE" 231)
  p% v2 C/ v/ R) P5 |)- m. ]' J# p/ N3 j9 V
0 Q' _) B* g( n
断开距离为两边各2,如果需要距离加大,可自行修改

' _9 d5 l. I5 r( \3 q2 n' J% I. [* ?9 B5 k) f, j( M( `
楼主同志
0 y, a/ `5 d2 K# S9 i看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人" @7 }  {8 t$ ]' m# |% ]
7 @/ k1 ~, P0 x. b
, T/ Y" N8 B* d2 P0 b, J: C
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:  p6 W7 S3 B' _2 p/ L3 S
) ?/ I4 b0 Z7 A+ a- W2 T* v# G0 [
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
) D( m  n+ A( C& `
( \1 L) x8 ]( W/ b
9 H4 Y! C- G6 J8 C
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
2 Y; c/ {' W* J8 W7 U  \0 M
$ |: o( S& H( y+ \- ~9 u2 t  |5 _

. _7 X: X. ?5 ]我默默的点头titter
9 l4 q4 b! c- E' E
8 k( W) I4 d! k6 e' z: U楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake * L9 M2 s6 k. x; |& H% r

# e5 j( w. h8 J2 i9 }

' o0 l4 s1 f+ z3 I9 d) f  B(DEFUN C:HD(); F, z/ H% Z3 G  X
这一行是在定义一个命令“HD”& I# ~5 t0 }( F9 F  v; a
(SETVAR "OSMODE" 32)7 J& }) B: B5 Y
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
6 D) R7 Q; i/ d% t# m; S(SETQ a (getpoint "\n Select intersection to break: "))
6 ^9 ~/ r( _6 F4 U4 p

% |% T' D1 j+ d6 w- [这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
+ L- _5 _6 Q7 U% G( c" t4 ?, s(setq x (car a))
$ g5 R4 h, _/ t1 C  |: n5 u
提取a点的X坐标,取名“x”
- h! ~. Z& S6 S5 n) a( @4 s(setq y (cadr a))& l3 G0 ?  z4 Z0 M$ g) ]
提取a点的Y坐标,取名“y”  I# z2 G7 D2 M9 I6 \3 X
(command "break" (list (- x 2) y) "@4,0" "@4,0")
) S! j7 c; n! p
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车
# |( t3 u- a8 {! B+ f$ C5 a(SETVAR "OSMODE" 231)( X; s/ e" _# W0 x# e
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足, a6 |9 P7 r0 N3 P+ k; L
)
+ \& E! U8 @) O2 O5 B2 x# {
程序结束
; t& @8 k" v3 f; \5 h4 v# Q1 Z& L, a) \- x! G
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★- q$ K3 B; j; p+ g
分析一下程序可以看出:让你见笑了:handshake
5 k  g0 m0 @& l) M
7 Z8 F& H0 S6 B( Z# v9 y, L
( b: P: C3 i, _: s# _8 T; |8 g  U1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )! h" `, w7 ^1 V& i# p/ c9 {& o
2(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"完全是多余的。(看看我这智商特低,理解对吗?5 g% W+ T$ _5 ~( L+ ?

" a% O' \( S8 z
( g5 P+ r( D$ p" |/ n
1 Y3 t' L# G- D% I
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
9 X9 w% w% e* L: F$ K8 u  `# t& N0 U8 }; J% Z7 O
3 R, e/ ^2 N- ^  X  c* V$ M- u8 k# z
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
0 X; Z% I3 m+ G$ P7 k
; P" m. a+ x' L  q3 s8 J* D3 s6 }# z1 O: T5 w
* J7 V/ v0 Y+ ]6 C+ j
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
5 Y% n. [& ]4 U+ U, j2、修改后的程序:' y$ ~# Q6 i6 P& R8 `0 T
(DEFUN C:HD()! d- B3 d1 G( H
(setq b(getvar "osmode"))
+ u# W. {* ]0 M
(SETVAR "OSMODE" 32)$ J3 ]& N0 ^7 w6 c2 o
(SETQ a (getpoint "\n Select intersection to break: "))
, i; D' d0 w: z: H- @
(SETVAR "OSMODE" 0)! t4 |" h/ X( `! C* ?! y
(command "break" a "f" "@-2,0" "@4,0")
! t5 L! e$ T) W$ `7 c9 {; B
(SETVAR "OSMODE" b)9 n0 E2 E( b7 l. n) y9 ^$ X
)3 o* F. H% T7 K
+ {. u. Y3 J$ r
把这个程序翻译成白话
* T" v8 n9 c5 u5 ?(DEFUN C:HD()# Q0 u! O/ v( Y- P3 h
定义一个命令“HD”
+ u$ U/ o! b) r* f2 W(setq b(getvar "osmode"))
/ _1 ^; H9 p0 t! t& a7 I' q! _+ J/ o
把使用者原来的对象捕捉设置保存为b; E2 q9 x, p9 X; O
(SETVAR "OSMODE" 32)/ y% L7 F2 s- W' m7 P& F
修改对象捕捉交点0 s4 Q) ]% B9 l1 N
(SETQ a (getpoint "\n Select intersection to break: "))
) p) V  R+ D  ]! T: m/ M9 h/ p+ ]5 f4 D- i
在屏幕上指定交点
# L! ^. ~6 o: Z9 j  U(SETVAR "OSMODE" 0)$ Y8 k1 ^( i, _" l9 i
取消对象捕捉
4 i' i' f# J% ?3 Y8 q9 ^  g2 M(command "break" a "f" "@-2,0" "@4,0"); l8 ?; H" }+ i1 P
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。
- L7 H  |9 \$ ]! {( g' H(SETVAR "OSMODE" b)" O& N/ C+ a- c$ \
恢复使用者原来的对象捕捉设置: H+ d1 [8 f, Q/ P7 {& f8 Q9 {
)! i- f1 U" Z3 G/ K* _
程序结束
% ~9 r. J# ]: F3 D; q
over

1 j! T  h0 h' W3 w+ v3 c1 `+ d, _& y9 U
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
" q9 q6 K6 u, T, I2 b; c+ a那版主給加幾分呀
; j" _' N- v) K' ^( W; K^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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