QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3880|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
9 F& }) n% P% _
# ^" E& y' Q/ C8 E3 s, j4 |$ B基本凭感觉打断
发表于 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
1 o6 s  u; L9 r* k5 p% X8 W我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???

3 v" P) B2 U0 J3 I) ]4 G
: @/ j& f) H! Z. z6 ^7 o  @据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:; i( Q0 p! k2 n3 P3 g
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化" g  w8 Y( H0 o" F2 r5 P
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
, G: p2 t$ @+ f! [) {- \3 P: M+ |
(DEFUN C:HD()
' V2 S% ^9 i- J1 g0 }(SETVAR "OSMODE" 32)
, Z- [0 ]$ F( l5 X9 F(SETQ a (getpoint "\n Select intersection to break: "))
3 L# U, J0 B+ j- F" b! e* y(setq x (car a))
9 d. i: S4 H8 z# H(setq y (cadr a))% N( ~+ ]0 g, e+ [) N
(command "break" (list (- x 2) y) "@4,0" "@4,0")
7 n- x. n4 C3 @, E- i* y(SETVAR "OSMODE" 231)
. [7 F( u& F8 {( J  x- e: o/ T)
6 Z2 j; V) U+ V& z( g# G
2 E; A& W7 L) 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
: ^/ V( ]8 f/ x1 n& c. M4 ^相交线横断程序$ H. s8 E; @/ ~# C5 v

3 p9 j% T0 w+ m& t! Y6 `(DEFUN C:HD()' ~2 ], q. A3 ^* B6 B4 ~8 A& k3 H
(SETVAR "OSMODE" 32)
9 y. t3 L  Q' b2 n1 j(SETQ a (getpoint "\n Select intersection to break: &quot)
4 E4 O, S0 b3 {! J! t2 d: h(setq x (car a))
6 a0 U8 e8 h5 }, B. k+ ?3 T, L(setq y (cadr a))" v3 g- N$ }9 K6 O
(command "break" (list (- x 2) y) "@4,0" "@4,0")
1 c3 z+ x" `& x% H/ t(SETVAR "OSMODE" 231)
& K4 b9 z$ ]1 X' v" I/ r$ h" B& f5 F)( u! w7 i6 L9 }+ J5 D8 U

- o- Y$ ?: m+ a. _; k* D断开距离为两边各2,如果需要距离加大,可自行修改
& E$ [" W5 j' r/ x3 j) m2 l
: S6 v, s1 P9 w: a5 R6 J3 r; L/ w
楼主同志 / C, ^+ p( ~2 {- y! J8 |! ~
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
# o, ]! j& L( k5 o0 y8 v4 @  h6 g5 F

3 [1 s* V5 P# O2 w悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
8 s' W6 Y( V( D, k& d* {) [& j, e1 C( A. X+ A. b% i6 s$ F1 Z; X
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★5 a; d7 e4 j& ^$ P0 G1 s

; u$ ~; J% j2 S8 Y) ]6 H) r# \, @1 T3 f& c1 K3 o0 k
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗4 m3 k0 E1 E! F, v

9 n# V  d4 b- W4 N: o8 r3 @" c% ^9 R
, Z! O; z( N3 i  r- @. T# D
我默默的点头titter
1 H6 w3 Q7 c2 t  m
0 q7 m3 n. ^$ \% W$ u% G% F楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake 3 r2 U0 O/ b5 O% b2 _$ T2 x6 \  T
$ ~  V0 @; P, g( c" B
7 `0 S" F/ t% X  I  t
(DEFUN C:HD()6 t& x" P3 m' O" d& g! r7 f
这一行是在定义一个命令“HD”% p( s/ V  ~0 c9 |% X! @' \: z: x
(SETVAR "OSMODE" 32)
/ g2 W/ j7 _- s- o& B: {, u6 d
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点' i( ]) p) m) g  E: K/ Y% X
(SETQ a (getpoint "\n Select intersection to break: "))

1 F% v6 Z1 r6 L8 C$ v' {# N2 F3 W* h% Z2 o; v
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter ): N, i7 P& Y* g# J( P9 y% |4 [" N% c
(setq x (car a)): m: ]6 t4 H% H* M$ S; e! O
提取a点的X坐标,取名“x”0 j3 h% R, q/ \& X4 g
(setq y (cadr a))3 u: i* I1 X; a2 A
提取a点的Y坐标,取名“y”4 S% B1 q; p% x; h! ]% O
(command "break" (list (- x 2) y) "@4,0" "@4,0")

* R8 b# v8 U  f3 \, o" |7 j* |0 T向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车3 n$ v8 u! R% l- p
(SETVAR "OSMODE" 231)- m9 [# k- g/ Y5 `
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足: F8 ^9 w. m( R' T. c" Y, |
)4 o+ d% N3 |- i, F8 \0 P0 k
程序结束6 R! w) V1 L8 \
( Z# ]' ~5 u7 X3 O1 |0 ~; b
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
9 W# V5 d9 _9 z" B" J6 v& Z分析一下程序可以看出:让你见笑了:handshake + w6 t- \/ }3 A& T, v

$ ]; ~7 f8 e4 ?" C8 J! r8 u- s) R' R( ~9 P+ c, ]8 [
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )
7 U3 r$ `  ]& Q5 m: 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"完全是多余的。(看看我这智商特低,理解对吗?" @! ?8 i, Z. o* \  e( o
) B+ z( @. S0 d1 T6 g8 Z& k# D

9 ~( g" R4 ^7 u9 f6 M5 o

2 s: q+ Q( |) C- w. P0 @★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
' ~1 K, V3 s! n. u0 N& ~* h& e& K+ W1 ?# V4 Z# i$ J( Y
3 Z. e5 `% @0 a# u: f8 A
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: + c- R4 O+ Z7 ]2 O  e

: V4 S) q" v6 ^# d& k  h" M( z( p
) d* x. y& B9 `+ R4 ^# U
( z5 E5 R1 m; [: o- O* G1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。. ~( D& K3 q. L# o7 ~
2、修改后的程序:+ r7 w) B  _8 [5 f$ t: ]8 S; Z
(DEFUN C:HD()  F& J  e8 N5 A; V! D
(setq b(getvar "osmode"))

5 f5 W8 P, b4 ~3 q(SETVAR "OSMODE" 32)
1 I% V! P& R: g8 R(SETQ a (getpoint "\n Select intersection to break: "))
% b6 i3 f  |% K4 V
(SETVAR "OSMODE" 0)& r4 q/ e/ R9 Q9 m
(command "break" a "f" "@-2,0" "@4,0")

" F3 v! {) g1 @) a5 ]5 L$ w(SETVAR "OSMODE" b)
* E3 `$ x8 l" T2 S3 P) b2 f$ V5 P)
+ {' k) g9 K* I- [$ F
* t: H& Q# g% B! e- g5 v. t7 z
把这个程序翻译成白话
- h7 b9 s3 w; ?/ |- `1 m(DEFUN C:HD()
& t1 }( b! v$ z2 y- I/ p/ X
定义一个命令“HD”
( f9 t' E  p& S  K(setq b(getvar "osmode"))) T! {: T. i; K: F) ^% |' P6 j
把使用者原来的对象捕捉设置保存为b
# {) q8 w: W  k  ~* N6 A$ }(SETVAR "OSMODE" 32). p* i1 g1 E2 ^1 A0 |) c
修改对象捕捉交点* u6 H6 i0 v( f' X9 i
(SETQ a (getpoint "\n Select intersection to break: "))
( y! Q, N1 K* z# m  z
在屏幕上指定交点
# c' K& R- J2 F& @: Z0 |6 p(SETVAR "OSMODE" 0); ~+ M4 W8 w0 d6 Z( a: O9 b
取消对象捕捉" D9 d* T. P1 U: U) v, w
(command "break" a "f" "@-2,0" "@4,0")6 F9 [+ ^/ z% F! Q0 b
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。& O6 x. y7 E% @
(SETVAR "OSMODE" b)
6 }) R5 M' }$ g8 t! G
恢复使用者原来的对象捕捉设置" }% c1 e7 I6 |/ z
)( p! i1 g1 e8 o& O
程序结束6 [  Z. m2 H+ ]! a8 x0 r1 L; e
over
1 x' A1 P! y7 m
+ W! Z! m2 P% Z$ t  H
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
) P# e( X/ r' b- G% s* ?那版主給加幾分呀1 ^$ w: M1 U. q: f
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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