QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3902|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
/ e5 n6 c7 Q" R# H& \( p5 F
% O; F: E$ Q) }- T7 X基本凭感觉打断
发表于 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$ U2 ~: t% Y  u$ i! \6 u
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???

/ a0 F/ u5 j( X  s- I7 U; g  C/ {! I$ D# i5 j1 H2 g
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:
* E' s* Y8 ~, e2 T! P; b. @% Y. B如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化
: ?9 c) Q0 f0 a4 l9 eCAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
  Q; b% Q% n' g' ~
( Q$ O7 W/ Q$ `7 L+ M+ h: X/ A(DEFUN C:HD()
/ d% E; z9 Q) k4 Q6 i4 X(SETVAR "OSMODE" 32)7 R/ W1 X/ t; C
(SETQ a (getpoint "\n Select intersection to break: "))
8 h# W' r; R2 l' _$ v(setq x (car a))
# _7 L+ A) ^) l0 Z. W. _(setq y (cadr a))
9 b  \* Q! m9 t+ E5 l(command "break" (list (- x 2) y) "@4,0" "@4,0")
8 C* x+ C9 p8 `1 }! ]( @* j. K(SETVAR "OSMODE" 231)
- s- u/ u) ~6 u! u) ~) l9 ?)6 _) }/ v/ ^3 ~* w3 F" N- z
; D7 K2 }% M8 }8 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, y  w1 X- A% R( s
相交线横断程序
- I8 Q% m2 I/ T: g9 d4 I$ I. m7 g; [( U
(DEFUN C:HD()
+ M' G2 a8 F) w(SETVAR "OSMODE" 32)
4 }% m6 s4 d' q& v% K7 P, T5 u(SETQ a (getpoint "\n Select intersection to break: &quot)
- w' r. F7 a2 U$ m4 U- D. C(setq x (car a))
& z* x" i. j) _4 C% y! a6 D(setq y (cadr a))% l# h7 \/ [, {; ]2 L$ h
(command "break" (list (- x 2) y) "@4,0" "@4,0")4 z8 b/ B/ ?0 ^% O6 Y* _7 k6 b; d
(SETVAR "OSMODE" 231)
' G/ |8 F, S1 h; w+ f! t" x6 })$ ~; N  \, I, `' V

! u' D& U. g+ ~: H4 k& u断开距离为两边各2,如果需要距离加大,可自行修改
( H( B; U' L. |  l
- M/ F4 d+ L9 N1 E
楼主同志 * x, m* d  u; l) z: u6 r, M) O
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
6 g4 I5 T6 j( u8 P, |2 X  B3 S& o) |- l7 j
0 j2 u0 c9 l. e. J
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:  H5 b1 E: k: ?2 H, r9 o0 |

( Q4 Q: A! Q# Z★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★. _% R8 u' p" h3 ?' j6 {
. T8 r% O" m5 n

- h6 i4 B8 l$ v  f. x8 [2 G仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗4 z& m# q  y, F$ W+ s

7 ]' a6 |; _( J+ m1 x3 p" @2 C: _
# H/ L3 t! I0 s& }2 K
我默默的点头titter ( O* L4 U! e" I  w4 x. S
4 S/ C9 z/ H) l9 B
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake , @0 h4 o/ `, e$ H5 C6 E

: W% y- x4 u5 d& k1 C; i2 x! e
$ I' e2 w4 a3 p. Y0 R# v( A  Y' n
(DEFUN C:HD()6 b4 G* e& w7 r  n- w
这一行是在定义一个命令“HD”
5 M9 m) d: b6 d2 s% |  a9 N" C(SETVAR "OSMODE" 32)
( s; z4 x# X6 o: q
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点: N4 s- e& u2 X
(SETQ a (getpoint "\n Select intersection to break: "))

2 i5 v  F: G1 I% C: ^/ j: I) O% w1 a4 V$ q  M' t
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )" e' R1 ?. |# u& h/ Y
(setq x (car a))
3 |: `) {5 Z0 e, V
提取a点的X坐标,取名“x”
  Q. z" F1 L5 c  T5 J6 k4 S( h(setq y (cadr a))
5 ?7 q  d5 p9 g* s" _, ?% S
提取a点的Y坐标,取名“y”
+ v+ y8 X& Z* q' M(command "break" (list (- x 2) y) "@4,0" "@4,0")
2 h0 v( e. X. x4 i* v* b
向命令行发送“"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 f8 v& T  f; _(SETVAR "OSMODE" 231)
4 s0 V/ F% d0 h" p; \5 B& V6 t; v* I* a
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足2 A' d& C& r2 y5 p4 b
)2 \- d+ r8 w8 R! S/ @! A. {; H- h
程序结束  C, a/ m9 g' V# Z/ U: f1 V1 U
7 |& x9 r; b! s0 C- K- Q$ X
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★7 A1 o7 ]+ o( ?; y/ Z, B, S( r
分析一下程序可以看出:让你见笑了:handshake 7 V2 j% B2 _, `8 b
! i+ k5 |5 `5 x1 a8 C% P
: ?* m" q* G3 y( r) Q
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )
# B; Q, x% O, L! Z  `% t2(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"完全是多余的。(看看我这智商特低,理解对吗?) n1 C6 I8 ~2 t5 n, g  T
7 _# P; r- }7 ?4 Q; E

1 v% C+ F7 X  H) q- x' ^! }9 t

9 e# c: B! p! u★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
+ I( i- x; `% @6 O  I# I$ V; c# b% Z4 J

+ k4 C; ?# _! i) |$ `这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
6 ]' n/ v4 @4 U0 l
  A3 v. F0 B) T8 }) p4 @" Q' O: D: Z: C
# j. \) U" b& P* z! b" Q
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。0 @& ^) d; C3 g2 ]" t- c
2、修改后的程序:8 w2 ^6 `* ~. {1 t7 Z1 N- l
(DEFUN C:HD()$ X& Q* e( @8 A4 I+ z  M
(setq b(getvar "osmode"))
  a+ u4 h0 x1 O# K
(SETVAR "OSMODE" 32)
1 g3 t4 S5 i# j5 X" U. a(SETQ a (getpoint "\n Select intersection to break: "))

- v8 g" h+ j$ o9 U0 d: ?6 h(SETVAR "OSMODE" 0)$ d, f# I; w+ T6 u( L6 l6 `
(command "break" a "f" "@-2,0" "@4,0")

- K. [! }9 W1 X+ B(SETVAR "OSMODE" b)
; ]+ J+ Q- p2 P6 A, }# `9 V2 ^)# R3 [4 X/ k- h1 ]

) u7 W5 y8 J3 U
把这个程序翻译成白话
, R  f. E. P% s; D& r3 @  u- i(DEFUN C:HD(); o# \5 m* g1 S. q7 @# Q6 X
定义一个命令“HD”& {( s3 n9 W. u, ?
(setq b(getvar "osmode")), e! {" ^9 z' K) y1 f/ p
把使用者原来的对象捕捉设置保存为b* B) V! @2 D' J5 {2 Y* t
(SETVAR "OSMODE" 32)
/ [0 ~/ I  f' M" Z5 O
修改对象捕捉交点9 C& x5 o- e# `9 i4 @9 H
(SETQ a (getpoint "\n Select intersection to break: "))
( N0 \: s3 H( j, t' E& G& r. t3 [
在屏幕上指定交点3 f( U5 L$ g3 k: U
(SETVAR "OSMODE" 0)
, j! j" z. O' X
取消对象捕捉
: C& [5 v7 m: N; e% L3 w(command "break" a "f" "@-2,0" "@4,0")+ }  q( R) m7 i3 z
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。( t; ~; I2 z- t( [5 i: z5 Y
(SETVAR "OSMODE" b)
+ {5 P* m! x/ s, {  t4 S: F0 u
恢复使用者原来的对象捕捉设置
& b3 A/ t. v/ F* j& Y# o)
% q, Z1 f( U) ^
程序结束
- I& S& C  B' e
over
( s& g4 S% f8 g0 j" P

8 Q1 L/ _1 z+ |$ W1 h( E
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
9 V5 ?1 p1 @; d. n! g4 O那版主給加幾分呀5 M. ?( H; J( b
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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