QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3900|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的7 n# A3 B- j/ O% s& ?; e2 _

; W8 n9 w4 ?1 {基本凭感觉打断
发表于 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
) C( b9 ^/ N4 |# k, d4 P5 n/ @9 ^我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
$ K: r1 }# `* D! N
% E/ y4 g. N; I4 v' N
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:
& W* p/ d5 t1 e! o如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化
# v* i) z7 l2 \. _CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序( L" r" X/ h8 E

) [( h9 n5 T  ]" B" }- _$ B) s(DEFUN C:HD()$ }) M: m( C7 q4 f( v" A# T; P% j1 B
(SETVAR "OSMODE" 32)
  d0 j) r8 g" T# O(SETQ a (getpoint "\n Select intersection to break: "))
6 o0 x# ^. o$ ?5 `* Y(setq x (car a))
" L- B5 Z# s# k0 }4 Q' y(setq y (cadr a))' `/ ^' i( k0 B  F; s4 ?5 R' p2 `
(command "break" (list (- x 2) y) "@4,0" "@4,0")7 J+ r3 G: ~9 u# |
(SETVAR "OSMODE" 231): ?# t' O5 W  o3 \
)0 B3 M; C6 V4 ]3 j- T) o

* M# Y! {/ v% m# R  V* \: \# o* V断开距离为两边各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# o) j9 V& ^% ]" E/ R7 i# i
相交线横断程序
" x8 C3 O2 m6 j) h, L0 m. J& T
8 \$ W7 W$ O# D: N' F2 C1 g(DEFUN C:HD()# H8 A2 l. s" Z9 C2 w! @/ t% P7 E
(SETVAR "OSMODE" 32)
2 B5 ?$ Z+ B4 z(SETQ a (getpoint "\n Select intersection to break: &quot)
* M: C- o3 u, x0 w$ {' e2 Y(setq x (car a))
; X9 p1 ?- p- o( P( V( z. l(setq y (cadr a))6 S4 b; I7 P, j6 X
(command "break" (list (- x 2) y) "@4,0" "@4,0")
( |: o/ Y+ ~2 a(SETVAR "OSMODE" 231)
* {9 T, Q7 T( F5 ^# })
- y& [& R# t, P4 H7 U& w, x- n% ]& ^: B( }" V
断开距离为两边各2,如果需要距离加大,可自行修改
9 L8 d$ C* p( [% q

( o# R& f3 v/ L, a6 V楼主同志
- s! r" i( W# u/ |. G看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
$ m) w$ O$ g7 h( t! @# D: X+ d. B  `1 _3 c" [* |
' A0 e& ?) F; k& N
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
& Y* |& e3 k3 k5 U  f4 v
1 v4 A* A5 r( h/ a, m- R★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★# b' }  M9 l) L- [8 y
. ?5 L  \% ~+ V9 ^
- b7 a5 D6 N, Y
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
7 I' q, O: a7 f' P; [. M; _$ `5 Z9 g* A" l% Y0 J$ S3 P
  W$ e+ H# G8 L) d! h" b% ]$ S) [* E
我默默的点头titter 6 C) P1 y* {" T. n
0 W0 i* G) @& g  L& S. e0 b8 Y) t
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake
, p6 {- C- N1 h; D, S' X1 Q
  i% P% k  Z* {% Z/ g

. K& `! H$ p% U5 }(DEFUN C:HD()
: G, \# m! A* F+ u8 ]
这一行是在定义一个命令“HD”, \- |3 B: [+ V2 l$ v5 T7 p
(SETVAR "OSMODE" 32); s- A' I( P' t
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点; h8 ^& u7 u, n4 R+ R
(SETQ a (getpoint "\n Select intersection to break: "))
* ^, h; L# k3 x$ ?4 ]. s) y. x; X
( \( r8 a- h8 X. E+ B  m" I7 D
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
% F% X( [( k- Y' s! P6 V& L(setq x (car a))
; T* ?) T( c4 ]3 Q6 g4 U* O  T& w! r
提取a点的X坐标,取名“x”
; k; v2 k1 X8 o: J4 y7 h8 N  ?(setq y (cadr a))& O* z- A# K+ I5 b0 E3 G: f8 h
提取a点的Y坐标,取名“y”
# D$ |, z$ V3 G$ T- k6 b(command "break" (list (- x 2) y) "@4,0" "@4,0")

: E/ n" d2 }6 Q向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车+ N1 t! \& f, U$ b2 q8 I
(SETVAR "OSMODE" 231)
2 ]! l: i2 x8 D4 T/ `  l" j
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
9 @: T3 ^% t$ M3 A: _. v)
, o! I# Q" [9 }, p! q  X# _
程序结束' F4 u5 L0 {* I/ z& [0 Y
5 C* d2 C) K# Y( I
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
) j4 c+ r) H+ u3 o5 W$ b6 O分析一下程序可以看出:让你见笑了:handshake
3 `+ I, y; o3 W! z9 f5 e  j
7 P9 V3 H$ R5 q# K- x
: Q, R, d1 R; C1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )
+ m; p4 O+ [4 q: Q# i/ F( E* V# ^, 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"完全是多余的。(看看我这智商特低,理解对吗?* F4 t- `* K6 ~

; ]/ A$ e5 G5 ?( u) B' C# }) O
- F/ M$ h. b; M0 _' z$ {7 ~) `+ ]
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
& z! h! P" K; W7 g8 s8 S9 h$ S. Q
  M, W3 E. Z1 u# S  @1 c8 ]
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
  d/ x" j5 A8 B  @/ U& D/ Z! [
( G# ~8 S5 L9 r/ q9 k6 n& Z% E. l& D8 v: K7 v7 T" k1 L& L
6 N, s* f1 X! \
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。, q: O3 b: R2 [6 U' H
2、修改后的程序:
8 \3 o2 V, t, @/ P9 e, D2 \9 o(DEFUN C:HD()
+ u7 P5 i- M' w) e, V7 s7 D5 E(setq b(getvar "osmode"))
3 }( }: D  ~# Y' Z  n
(SETVAR "OSMODE" 32); e# Z6 h% Q6 E7 U/ k
(SETQ a (getpoint "\n Select intersection to break: "))
8 @" J" X# R1 w4 ^
(SETVAR "OSMODE" 0)
' N# N- o3 `9 h(command "break" a "f" "@-2,0" "@4,0")

3 I+ _6 L, N) b4 y/ ~, B3 G) u(SETVAR "OSMODE" b)$ G2 P/ O( Y4 t" h: h0 g9 ~3 j% M9 Z0 ?
)  _% c* k# J/ a% l7 N# K2 B9 k; J5 |
4 c/ k" e" k/ ^5 @7 R& b4 C6 Q
把这个程序翻译成白话
1 p9 @5 v) i' T(DEFUN C:HD()* Y* {6 f7 L) X  v2 \3 C) l
定义一个命令“HD”
) S2 z9 c+ \- N& f1 I0 G5 G8 B(setq b(getvar "osmode"))
5 N+ _- J- r" L! |* a# A
把使用者原来的对象捕捉设置保存为b, U, }2 v  l' V8 I: Z) }4 v
(SETVAR "OSMODE" 32)
& q) O: q$ m; [) F& M1 a, G8 n8 ~
修改对象捕捉交点" g- @# ?# p0 W5 q  f
(SETQ a (getpoint "\n Select intersection to break: "))
: @$ P; X- `: f6 q! a* J2 g" c
在屏幕上指定交点2 u( F9 _- i6 }- r! @
(SETVAR "OSMODE" 0)
. h4 J, I! |$ O1 G
取消对象捕捉
/ Q. p; i! ]) ^2 n4 u9 E+ A" M(command "break" a "f" "@-2,0" "@4,0")
# w% O8 J$ U) H0 H8 m
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。
- ]! T. `9 h/ @3 B6 F- e(SETVAR "OSMODE" b)! v% b5 t7 O4 ?( d
恢复使用者原来的对象捕捉设置  p0 J; V* N2 s3 F2 z: c
)
% t) `, m" ~3 P8 }1 P$ O  b
程序结束! T/ |3 D6 g. R- p. q0 n  x
over
& f$ N0 d; N5 w- V

  U; m' X  h) W  b% H
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作, M" T& f$ ~; m, s* X( v4 F
那版主給加幾分呀7 @2 y' H8 h; a7 U* ^
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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