QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3881|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
# U1 S& E3 v0 f: ~& W/ V' W2 O4 j' p1 ?4 Z% b* b. ?4 s" C
基本凭感觉打断
发表于 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.gif9 L- X$ b' A: o+ j: s- D
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
. l9 n/ F3 V: L7 y  S2 I' Y9 p, @5 F
- _7 |( a* c5 ?5 q
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:0 m1 x8 @- m0 j
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化3 \* U  W7 H" c! z7 n' J7 L" C; m
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
' r5 ]1 O. S9 }7 g. C
7 P/ H5 c: ?. f% i% W" @; c4 i(DEFUN C:HD()
. e' O- s# _! P0 q) S# ?' a( m+ o(SETVAR "OSMODE" 32)
' s7 \  Q7 P! q; P(SETQ a (getpoint "\n Select intersection to break: "))1 g% u' l  z+ O
(setq x (car a)), k! [3 r# Y+ ^
(setq y (cadr a))
$ e% ~9 F( V  ?" D: f" T(command "break" (list (- x 2) y) "@4,0" "@4,0"); H8 p" e4 H& M7 c; `' R* U  S. z
(SETVAR "OSMODE" 231), A! L8 A. {- u( e
)" O7 A+ B3 b7 C/ t2 H& B" V# w
5 C% d  d; H) X' E# }! [
断开距离为两边各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
7 x9 `6 c0 l$ O+ s4 N( ~相交线横断程序
; `: w2 }7 p9 B  B2 ~- Q* g' g& w# X
(DEFUN C:HD()
$ Q+ s& P, j; [3 b(SETVAR "OSMODE" 32)
7 ~6 i$ J, D, K# X2 `; P(SETQ a (getpoint "\n Select intersection to break: &quot)+ I5 Y% H5 h9 j
(setq x (car a))
  P( L# m9 `) B. E  y4 A5 {(setq y (cadr a))' N- N( C5 {4 r
(command "break" (list (- x 2) y) "@4,0" "@4,0")
: t/ N% K+ f$ ](SETVAR "OSMODE" 231)
& X/ D, ^' c3 K8 q)5 d& ]7 a# M3 ^6 _8 i% O

4 n4 w8 s4 H/ N+ H/ A' u) X3 l断开距离为两边各2,如果需要距离加大,可自行修改
) m; G$ _1 b1 J  X; T/ D0 v0 L5 X* I

3 y7 `; c. O4 \( K楼主同志 3 ]: e2 m: [! @
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人: S# z% @$ q5 }/ ?5 ~
- ~! j' i7 m& J6 t
1 k! R+ q/ ^+ Y4 Q
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
" N9 e5 I% b& m6 D: E! ~( a8 |; H: v3 q/ _  u* O4 I
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★, h7 R; N6 o, |3 q% N; a
: @" Y6 W3 `9 R8 i

: C& r! W% t; i仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
& G2 H" S& E- X: P
6 b8 Q8 y( l+ x: s1 x
8 a1 J- `+ M; }/ i8 s; C& w
我默默的点头titter 9 r8 e4 g  e; c& W
3 B& f( _$ ?8 S& L! b# c& N
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake % t; X- E0 [- _5 D5 ^  R+ z& X

/ F/ K+ ~( l+ z* N: _8 N) t: f; x6 n
* H2 ?7 h) E/ p. W) b. t- h
(DEFUN C:HD()+ `6 O2 a, j4 s* X! r% R# q. q/ s4 X
这一行是在定义一个命令“HD”
% n! {- Z0 x" `% _7 M/ P(SETVAR "OSMODE" 32)
  z$ K6 n/ a  A8 l. `" X4 r4 K
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点2 a# o! z8 D: G" |7 K* Y6 c: z
(SETQ a (getpoint "\n Select intersection to break: "))

6 ]: C" i: X- [- _
' u, w2 ^2 j, V, l; |4 \" }! O+ g这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
, F- |! Y' Y" |9 @# I(setq x (car a))  A* o# t: K' u, L4 N
提取a点的X坐标,取名“x”! |! N: _# X( K' a: g3 z, W0 [2 R
(setq y (cadr a))  F# U4 o( v2 K8 m) v4 N
提取a点的Y坐标,取名“y”% Y4 j$ K7 P$ K0 a/ n9 I% E& \
(command "break" (list (- x 2) y) "@4,0" "@4,0")
7 b$ K2 v& Z6 R! l! g2 f  }5 }
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车
5 H# V- K& Y  g8 e2 }4 u$ k# f  a(SETVAR "OSMODE" 231)
  z, y9 o5 ~; t& `! G: g
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
/ X" i* o3 H! X) s)
/ m, E) u( i' }! Q8 w+ N3 C
程序结束; f7 w( d8 q0 l$ H9 g
% |+ y$ m% s4 I& N
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★0 N, n4 }$ \: i8 @3 J
分析一下程序可以看出:让你见笑了:handshake
$ W: D5 L8 A3 w  b- ~/ B
( o3 f; M2 l0 j/ P2 B+ m7 f. f# b" I$ X3 G
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )
, U' d  Z4 \9 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"完全是多余的。(看看我这智商特低,理解对吗?2 h5 P4 O+ P7 D& o, K
9 O: ~) A1 U% p

$ s) n5 V0 w7 k; y9 m7 s! E
# l: V8 u- h3 Q1 e
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★$ y  m$ m1 T$ e9 ~+ E
6 x6 y- ?* @1 p) D6 F" c# [
$ ^. e' M" O& Y- g- @0 O
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: 8 s" n. X; c2 Y$ W0 b0 R' ^1 V3 I

, P1 z$ h* L7 o0 \, V. I6 ]  y, d- u' M9 N1 ]* f+ k$ n

, J1 S- n, _" y! m  S& }) B# r1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。) l  W& y0 k* z  O. y+ ~# l) F7 q
2、修改后的程序:5 |% U0 w' Q% q, X( t. L
(DEFUN C:HD()) F  o9 w% G* I1 t# d( [7 _
(setq b(getvar "osmode"))

! y0 L; p- A2 P8 N(SETVAR "OSMODE" 32)' A! e: T; y( F! M# r
(SETQ a (getpoint "\n Select intersection to break: "))

. V  _" c4 e" K) L; q9 E(SETVAR "OSMODE" 0)
" G8 o8 w* }% T) ^5 W9 B(command "break" a "f" "@-2,0" "@4,0")
3 X6 D) o  \- G
(SETVAR "OSMODE" b). c% h6 j$ o! A1 o- Y( P
)# v# ^) [9 M  A
5 `/ q8 Z+ x* @5 j' O7 k
把这个程序翻译成白话* S1 n5 y% `" E1 B! x
(DEFUN C:HD()7 ^& I& X" e9 a! k7 ]
定义一个命令“HD”
# G, a! p  Y8 p5 `& p% m# z(setq b(getvar "osmode"))
( F2 i6 t8 N1 U2 v" j
把使用者原来的对象捕捉设置保存为b
3 C% [( M! S1 ](SETVAR "OSMODE" 32), Z9 M$ E3 h4 X5 k; M
修改对象捕捉交点
" U8 Y1 Q6 u4 i(SETQ a (getpoint "\n Select intersection to break: "))7 y) p# }0 r! J$ K
在屏幕上指定交点
' Z6 V  }1 x7 p! Q: j& M(SETVAR "OSMODE" 0)
$ P" R  j( [# B* V8 P
取消对象捕捉
( l, a9 c) h' W' ?0 u& i, p0 }+ b- @! |(command "break" a "f" "@-2,0" "@4,0")
- K  B# ]6 M7 Y
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。6 o* q! c# j' v5 b
(SETVAR "OSMODE" b)
# Y5 K4 f( W% o0 A% h: L
恢复使用者原来的对象捕捉设置, D& v& w8 ^; `' }  j
)
! P- c# Z" `" h  |! _' M, U
程序结束; x2 C. ~8 I; N2 B
over

. G( a; [2 z1 t0 }( ?! c0 C, _3 D; C2 `7 k% I
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
6 T* }2 a5 e! ?, a2 v! |那版主給加幾分呀' M3 @9 V+ U$ C  @5 A# @
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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