QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
3天前
查看: 3904|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的" @* p% L* p8 X
+ ^% W' ?- D6 g" Z* d+ c# T# L6 R
基本凭感觉打断
发表于 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
' [6 |* i* W- n8 r- g3 `( ?- m我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???

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

相交线横断程序

相交线横断程序
  z1 q1 {. m/ B  m( v* L+ T  n' a1 o! s0 Y
(DEFUN C:HD()8 U* P2 p# V& `7 ~0 d# b
(SETVAR "OSMODE" 32)* ~7 {$ X0 L% H* e( `* x
(SETQ a (getpoint "\n Select intersection to break: "))8 n0 U  [2 H5 A+ P
(setq x (car a))
9 e, E5 G  g2 E8 h3 s(setq y (cadr a))
4 W: ?2 h8 E* n(command "break" (list (- x 2) y) "@4,0" "@4,0")
  E9 c' J! ?+ f9 O(SETVAR "OSMODE" 231)
( E3 ^! N. Y7 J4 m8 x" }0 ~)
8 h& W6 M$ [, ^& [: F; P* [  d! w7 g& N( r
断开距离为两边各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  P% K! E+ J( J
相交线横断程序2 T) @; m5 d# b( O; S$ L+ I
+ W9 w, E; t; E
(DEFUN C:HD()
' e- e: u5 u; t# P1 R* W3 \6 A( f(SETVAR "OSMODE" 32)4 Q0 S, J" H6 C6 Q' l! n: @
(SETQ a (getpoint "\n Select intersection to break: &quot)
3 v8 [6 g! r4 ?2 A( g/ N(setq x (car a))6 v! T1 }* `1 A  L7 `. \2 z
(setq y (cadr a)): u* v) b4 s& h- l" J
(command "break" (list (- x 2) y) "@4,0" "@4,0")* {7 Q9 |3 t0 F
(SETVAR "OSMODE" 231): O; @+ x" b1 G! G6 H
)& ]9 W! U! I6 {8 ~4 @# ^

* J- x) x7 J! ~6 s9 z断开距离为两边各2,如果需要距离加大,可自行修改

* z/ V! h# O% |0 r+ ~, |5 `; O
. V- v# c4 T3 d8 F" Z楼主同志 : a; Y  M6 I% x: I: s- w! U! [9 D
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
- V. u% L7 i( O4 L& A$ f. s3 G
7 o5 S7 j8 s0 u% [4 x4 O5 T8 B' i
& N+ T- r5 T) i' ^, a悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:! g( `* ^# d8 O, |3 a, ~5 q
. F8 N" q0 S2 u, S
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
1 ?. V2 L+ U6 |$ Q" i+ m

' \2 u- T/ m: l* v
, p8 |7 Z6 h+ W仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗1 a) X; E; T6 Z
8 A& s1 y; ?- E! W3 K$ R& X- N
8 f2 A1 m0 u3 b" X( }
我默默的点头titter
3 F2 t, W- o- s8 D9 _2 O9 t7 R6 D6 W1 J6 [- ^4 c4 d/ }3 i6 d! o
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake ! [% y. I' m& S4 x! @0 T
; r( E7 ]/ d+ x% i

7 j' d, F" `/ [5 f6 Y( C(DEFUN C:HD()
7 C% g, w% s- e# H) P
这一行是在定义一个命令“HD”
% ~& h& t7 h& ^" {(SETVAR "OSMODE" 32)
* L. E7 k6 p5 ?) L; F
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点$ ~) y: F7 |: T+ r) y! f" j: U" y/ P) n
(SETQ a (getpoint "\n Select intersection to break: "))

2 n  m: X- D2 h& Z$ U, X7 G- F7 Q0 F: ?1 ^, Q  O7 d% b
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter ). E" c$ u5 A1 S; F0 s
(setq x (car a))
1 B5 e# d7 I, z! _7 n* @
提取a点的X坐标,取名“x”% S$ [! E2 l* m6 X! _" v
(setq y (cadr a))& g, P2 D: v3 F% ^1 X
提取a点的Y坐标,取名“y”
: f) X+ e& O6 w3 e(command "break" (list (- x 2) y) "@4,0" "@4,0")
6 r0 D+ y* M2 c
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车! \) I1 c0 j1 _+ V9 m
(SETVAR "OSMODE" 231)" l( @, D" k% l/ D# H7 k
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
$ e' I1 T9 F. T1 m3 @% |- m6 g+ t)
- ?9 Z9 {6 E" L. M7 g' U& L
程序结束
& O. L2 s3 _; L7 g' Q  e8 {0 o3 H
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★  S( ^6 F1 ^! [+ _2 N
分析一下程序可以看出:让你见笑了:handshake
7 N) U" v7 g$ ~8 @8 |7 T6 W% I7 K, \( z- K' v8 N% I

2 q' `% L8 r5 E- G' d* I1 m1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )! W- w7 E: E3 {4 d! N8 X4 N
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"完全是多余的。(看看我这智商特低,理解对吗?
2 x* _# a+ C' j2 Z/ q- V4 c7 ^4 v; |: [* s

7 D5 {$ @. p( P
1 H& U/ V& `9 J- H
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★( J% z( D- v7 v$ D- J; M

  B4 M- o* l" l2 U4 u/ ^' t, w/ |
+ v1 B7 i- B$ M2 @这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
+ m$ t4 O3 c* c- R6 d1 G4 G5 o6 }7 P/ a# n4 K+ u2 q
+ @  R3 m5 G3 B! K$ ^+ \( \- X% J

7 w8 c/ v9 F6 Y" C3 v7 k% S# U# u1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
: w# Y$ z! z$ t2、修改后的程序:4 K- L: B5 T" P9 l' o
(DEFUN C:HD()
; F2 q/ I" c$ w) F5 W% R(setq b(getvar "osmode"))

1 D8 w. f' h: f+ y" f(SETVAR "OSMODE" 32)! t- W; ^9 E- y: b8 t+ V5 \* N
(SETQ a (getpoint "\n Select intersection to break: "))
& i5 j+ o: l% d: G$ v! K+ S/ F
(SETVAR "OSMODE" 0)
+ f2 c6 \' T; ?(command "break" a "f" "@-2,0" "@4,0")
3 V+ R# @% @" ]9 k8 j
(SETVAR "OSMODE" b)
) j2 E. `: f. [( X5 Y5 z1 e" q) b)
! q) I0 x( U8 c! Z/ P
3 {4 H6 P) s( ?5 T: S$ S
把这个程序翻译成白话
# Y9 m% @6 @' ?! a( \( b(DEFUN C:HD()* S& ?7 \: A+ r
定义一个命令“HD”
  t+ m7 H& H  y+ t(setq b(getvar "osmode"))
  s6 N% J7 W" p. R4 l. Z$ b: N+ L
把使用者原来的对象捕捉设置保存为b
# M- q! @( g  v1 w0 l) e) e% s(SETVAR "OSMODE" 32)) ^/ @6 }6 {" j. i
修改对象捕捉交点; Z( Q5 }7 x- ?2 \. U/ e/ d; U! ^
(SETQ a (getpoint "\n Select intersection to break: "))
; w- Q5 H+ s/ J: y3 {# ?% h5 R6 W
在屏幕上指定交点& n8 W- h7 L* D$ ^7 L
(SETVAR "OSMODE" 0)! l+ L1 @8 F! W7 g4 t7 b4 D' H2 ]
取消对象捕捉
/ C" H) P3 k  _2 G(command "break" a "f" "@-2,0" "@4,0")& N: I6 s( l" E& h8 F  X2 F. W
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。
' H. F- ^& N- W(SETVAR "OSMODE" b)
  k* f7 s* P6 p) i, R/ w' C
恢复使用者原来的对象捕捉设置" R$ h1 ^7 o  @( H6 O  R7 q( B3 t
)- M$ T1 v- L7 K
程序结束( Z. x$ ~1 b7 F7 Y
over
! u, z$ I8 j9 o8 Q0 W+ @8 q

3 d$ P% `3 I6 ]2 I
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
! p' C4 E; N0 v那版主給加幾分呀
% F3 S8 H, [0 _: \+ t: \^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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