QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3885|回复: 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 {4 \( {2 i, L# P
- `- V! F2 f* ~7 K. w1 D% R0 f
基本凭感觉打断
发表于 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  }; L( e3 X/ G: K6 b1 a9 U- d" M
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
( X- n- j( H4 V* d' A2 l

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

相交线横断程序

相交线横断程序5 i, o- T3 R. ~$ p4 W
" d- s% w+ P6 D( j% P1 Y* J0 ?
(DEFUN C:HD()
" z9 Q# U+ ]6 m+ t0 V4 a(SETVAR "OSMODE" 32): P: q/ d" h- P
(SETQ a (getpoint "\n Select intersection to break: "))+ H" M- u* s% r
(setq x (car a))( V0 G3 H* i3 m; j& W% }. n
(setq y (cadr a))
$ {( Q. W& ?* a9 n9 p(command "break" (list (- x 2) y) "@4,0" "@4,0")
5 S+ E8 S; ?/ G/ R, R(SETVAR "OSMODE" 231); U. V! l" p. b8 G, L
)
: g6 m  I- b# J& f( K# t  D; f/ d) m
断开距离为两边各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
$ u' [$ J3 n1 \% i相交线横断程序2 G9 f% z, g9 b9 W& D0 _: I" r5 n. Q' q

6 K7 w, E0 |+ L4 i  y/ m3 n7 ?) {(DEFUN C:HD()0 u: J3 C# ]; P
(SETVAR "OSMODE" 32): G9 t9 E- D. _# K4 Y# A4 U  S
(SETQ a (getpoint "\n Select intersection to break: &quot)
5 c) O& i% ^4 z. A(setq x (car a))
% O( F0 a# e8 h1 ?& O; ^4 }(setq y (cadr a))/ v9 G3 v  D/ r5 o) g6 O# ]
(command "break" (list (- x 2) y) "@4,0" "@4,0")
& p% D/ ?9 s- w- A(SETVAR "OSMODE" 231)
: F, w/ o) I2 x5 V/ [/ u% X" e)4 P* Y- f) u  _3 x. M
: J1 H9 Y/ i5 \( X+ Y6 h
断开距离为两边各2,如果需要距离加大,可自行修改

3 z$ _2 n# B, `( N
9 I# w- I: [1 j( v( J- {  s# _楼主同志
4 C; r9 l  c5 k/ G  t# O看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
: E8 N( }1 U7 F- ?/ l  D, r6 N
, t3 U( h% J( U) J( F4 z) f2 P
! u: K2 P+ i! m8 i0 |3 b4 G6 X悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
/ g6 F; E' A4 \  n" S+ D3 L1 \
3 N! }0 t- {+ S' m9 W  ^8 j' ~★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★; p1 V; @9 s* S3 H# u

8 C6 F# r+ q* g7 h6 O
5 d/ H7 ~1 }) b9 B' j- @仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
) u: r% v5 A, K$ d2 b# b" x& A  |, q1 f/ A2 j, U& Q7 a/ D

. y, B, A  x3 e- R' i0 N) Y; [我默默的点头titter
1 ?# S# e) i7 A- J) x$ h5 @- E5 d; P4 a. d5 @$ `# |( G# [
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake ; P: e# R" @# X& i1 j6 u
8 {! ?# _# [% Y  M+ ^, Q5 `

$ Z* ?' v- C( M% b(DEFUN C:HD()' c2 {% ^5 D$ t2 t1 B
这一行是在定义一个命令“HD”! h3 O8 x0 E7 \  U, k! F5 I
(SETVAR "OSMODE" 32)2 _; B/ Y. v/ b3 _
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点6 ~2 n3 S3 Z7 q) Y
(SETQ a (getpoint "\n Select intersection to break: "))
; O, H% N& o! b

) z2 H, [) V5 m1 }; x# V2 K9 h- p这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )0 w9 C& v4 U- {) {) T
(setq x (car a))
% r* n0 |4 T2 A2 b$ G! O
提取a点的X坐标,取名“x”
4 @4 G2 k/ U6 T1 k9 P9 \# a* _(setq y (cadr a))$ ]; E2 m. j0 c5 ?6 C
提取a点的Y坐标,取名“y”
' k/ E4 y, f: I  s(command "break" (list (- x 2) y) "@4,0" "@4,0")
* f* q# u- D8 ?
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车
& {  E  I" _% f: E5 ^/ T4 E  ]+ _(SETVAR "OSMODE" 231)
/ v% }5 T$ [* x
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
- n! J$ C! |) o$ v  }5 u) P)5 u& H7 F: N: O& b/ {4 |0 p
程序结束1 e+ b" V, I' j0 z2 ?
! v* i. r- ^4 a; p8 p
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★7 H# F# h& j' }6 @% W! M4 l
分析一下程序可以看出:让你见笑了:handshake
6 v! n7 [, G: I4 x- T; R* J/ D0 g+ v" Q

- \3 t7 {' a  i2 h6 D/ A$ C1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )# X/ ]1 f! ]" J: C1 [9 l* O$ g: l
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"完全是多余的。(看看我这智商特低,理解对吗?% E" U; R% b5 M# }* f5 T- V1 e7 x3 P
( f4 v& J7 W. s+ D2 @

& g; s' q* L0 a7 O9 M( X/ i
" s. ]0 {( b! y0 V+ C
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★+ B2 k  f8 H* g% w" d

8 z' q/ H9 [# f9 Y0 J8 S9 k
3 p* t$ n' ~) v0 x" ]+ Q这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
- P/ \8 {; y+ o1 Z2 {, Z7 u  c0 L' I

# t  G) o9 S4 ^, Q1 x( p4 f" ~+ m7 a. k) \" V9 b
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
" L: F4 a: X$ P$ `2、修改后的程序:
# w6 u" A2 N; K* g8 N9 W# L5 q6 m(DEFUN C:HD()
$ L+ ~1 v) {2 G# y: R* `* j, B; |+ i(setq b(getvar "osmode"))
. ]* }2 y, k6 o$ s/ G# k
(SETVAR "OSMODE" 32)$ T& B  O/ A' p$ }, g% P  q! [
(SETQ a (getpoint "\n Select intersection to break: "))

( W2 V7 \% ?2 g  X. y4 \' ^/ u(SETVAR "OSMODE" 0)
7 O0 N3 L. E  q- i# a(command "break" a "f" "@-2,0" "@4,0")
/ B2 x2 W0 \  U6 J$ F
(SETVAR "OSMODE" b)
$ o5 W) s% ~% @  f3 O). i! U/ o7 C: m- h
7 [" |2 i$ n' f% R6 C
把这个程序翻译成白话
5 _. R2 N6 o% b3 q& d/ H(DEFUN C:HD()
9 ?+ S7 o4 U6 X* j
定义一个命令“HD”& Q/ @' y4 U  Q( u- ^  l9 k
(setq b(getvar "osmode"))
9 ~: @, R' s; F, b
把使用者原来的对象捕捉设置保存为b
( s6 W. k, l8 T0 O, _) i6 U8 h; S(SETVAR "OSMODE" 32)* D  w: |2 p5 E' A, S
修改对象捕捉交点
7 ]2 M- j6 s# n# |& E" [  w6 V(SETQ a (getpoint "\n Select intersection to break: "))
+ j, G" o1 x7 F4 s" t3 J. P. I
在屏幕上指定交点. Z0 E, f9 P' E
(SETVAR "OSMODE" 0)) X  b# n  P7 [, P3 N
取消对象捕捉8 a9 P* T6 @: s2 A
(command "break" a "f" "@-2,0" "@4,0")
7 w  Q. @# O3 r) E" D' ^
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。
4 p! H+ }' y1 D- U- C9 Y(SETVAR "OSMODE" b): H7 G' T, B0 y5 L2 }! K
恢复使用者原来的对象捕捉设置' R8 D9 W+ Z5 w/ B# C6 v
)
- k* F5 l' h' P& k- m; r% x
程序结束
% s5 v% F$ K/ [% ]
over
) Q6 o3 _$ n' ^

7 w5 P  m% i8 v9 b1 j% S
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作* ]9 [- [! G- n, ]4 A3 g& G
那版主給加幾分呀& e: g+ T# g+ L5 b9 f
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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