QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 3876|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
2 }" `$ s; P4 x* f6 {1 C, ^% V6 I3 `" 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& o0 r5 g6 }" l: l) {7 ]
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???

5 _. y8 J! v! ?" T+ l- w1 `
$ u& g! t8 F5 G8 l. ?  A  I- b据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:) G8 }+ {% D! ?; K. t  a9 e
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化' h7 h4 U; y7 l! ^+ ^7 L% z% S' I
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
4 s. N$ [9 V6 P; o
) K4 Y7 W8 [5 l, Z" F5 P(DEFUN C:HD()& Q  _; n! X4 e  }! S0 h5 E
(SETVAR "OSMODE" 32)
) C7 I! i4 \4 D2 ]5 N, c(SETQ a (getpoint "\n Select intersection to break: "))
8 P5 I; i7 j  n7 s! T(setq x (car a))  ?( {$ F  P" ~  W+ J1 V$ {
(setq y (cadr a)), A* N3 ~$ X5 Z
(command "break" (list (- x 2) y) "@4,0" "@4,0")
4 a3 d- ^' C. E# K) ?. w% Q(SETVAR "OSMODE" 231)
( F& b& B. z% D% j0 a% h' s" z# w)
6 D+ z: x- I1 E1 k1 x- F! T! U
" B& K4 p/ p1 d断开距离为两边各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
. J+ h) f" M- r) t& K" E  ]相交线横断程序
0 B: n* P" x0 A& [5 q% v2 N2 m/ u; V- a
(DEFUN C:HD(), f* \3 w4 ]- R$ x/ {
(SETVAR "OSMODE" 32)% ?3 O; n4 x# r  a
(SETQ a (getpoint "\n Select intersection to break: &quot)& D# M0 k% y5 i- x
(setq x (car a)), t+ B5 a3 N2 N. O: \2 U* A' X. D
(setq y (cadr a))' m' S  Z/ R' b' O0 }  w
(command "break" (list (- x 2) y) "@4,0" "@4,0")
* W' ]1 w" q+ U3 a' h(SETVAR "OSMODE" 231)9 e+ k! x! |5 c+ I% U
)  S8 Y* B+ _* Y5 X

) g3 l2 @8 k$ E5 q+ P断开距离为两边各2,如果需要距离加大,可自行修改
8 b& o2 L9 R3 M: F' [2 [2 f% o

1 P0 \- n! `" f1 O; U) H. X( F5 k楼主同志
1 m- S7 _  m6 E! u; I看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人. d1 L3 ?" K, C+ _6 a0 X
3 z! j6 Z$ N7 D9 a: }5 w6 F

' \* j2 [4 J: o悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:! w; ?- R! q2 a, N& s3 q4 D! {* b
- s! e9 b" @4 p+ v& y# q% G& I+ _
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
( Q' q8 [3 Y5 }0 z, J9 ?* [% L2 n4 t/ R

$ ^& K- S% n. w: ]% {; M! F5 u- A( A- a. h7 ]8 T
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗2 Z/ }5 X' ^. K8 O8 ~

1 W$ e8 d3 |1 _
7 g7 `5 {  ?5 W! P, I
我默默的点头titter % u# H% p% V5 w' e6 y, V
7 k* p2 t( g6 O+ x. @/ n
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake + y2 |% p, `; U% O/ ~% J

3 F4 U+ O+ ^! @8 @/ g

% ]! A& C# d& [) W/ w$ F! i- ~2 s(DEFUN C:HD()  S/ T2 T# `! n6 s! [) b( k! Z+ Y4 p
这一行是在定义一个命令“HD”
3 b1 ]1 z2 g% P) f/ L* n(SETVAR "OSMODE" 32)
3 k) }' ?3 z7 E/ v, Y8 d' g
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
1 @( d7 j: P- S4 {, a3 X(SETQ a (getpoint "\n Select intersection to break: "))
# V; G, n2 Y4 h, n
5 D- B; t# b6 O4 m( L- C7 \
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter ). {3 V& F% J& h+ a
(setq x (car a))4 F# u- k1 c* K
提取a点的X坐标,取名“x”
4 `' B% A, o, i4 l( i7 {(setq y (cadr a))
/ l* ~  f9 n. ^) V# a
提取a点的Y坐标,取名“y”
; K' D+ k4 _" K& l5 e8 L7 ~(command "break" (list (- x 2) y) "@4,0" "@4,0")

4 k- Q/ c+ V! |: g5 ]& A向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车2 M/ ~3 U; k, G7 b5 v* {# R) r
(SETVAR "OSMODE" 231)8 n" M, g5 A8 ^+ P. I' H$ k
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足3 E! \' D, o% K2 S9 i6 s5 @
)
4 [$ I, c- T$ O2 r$ V
程序结束
& I2 l2 t. V0 n0 y1 b& G) J" e' F. y1 r
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
1 m& f  B) t# o4 s5 z! ~+ D分析一下程序可以看出:让你见笑了:handshake
2 M# @2 V7 F. l- m2 ?' b$ A# R" y: l* C! L* X- n/ Z& q' P

4 [$ _4 n. j* @+ j3 D7 b  ]# `" v1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )9 ^- y' Y( D+ w
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"完全是多余的。(看看我这智商特低,理解对吗?1 d: O# J) a4 Q* ?, I2 K+ u
  p4 b6 S  t9 ]6 A+ l
: K7 Q7 _) O4 z; @9 H/ x4 G2 k
% {; k. I8 x+ m, A! ]5 h
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★, A; s& g: U% u( h8 S" c
' D5 ^0 Q% l: l  Y7 g; M

' S2 V$ `  f- n$ k" V0 z" b这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
$ ^3 {9 T6 s, u1 X, u* N+ f/ X8 n& I$ i7 Y4 K, u% ^* z6 U1 r
! I( k. b+ K" u- o# p$ F9 m7 j

' f" O# p3 N" [2 k1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。7 I: e0 ]* P% S0 {
2、修改后的程序:& r, Y# j: z, ]$ q9 ]; @
(DEFUN C:HD()
* ~: E: S- E. k" Z/ P(setq b(getvar "osmode"))

7 H' h' l6 f# \, \6 z0 h(SETVAR "OSMODE" 32)
' Y; E5 W# V; r, x: ?( @- @& \% u! O(SETQ a (getpoint "\n Select intersection to break: "))

7 S' r- F0 J0 Z' ]$ R(SETVAR "OSMODE" 0)
: J% `' C/ t1 }$ J(command "break" a "f" "@-2,0" "@4,0")

& _- Y0 y' A9 H/ P(SETVAR "OSMODE" b)
: h- g' v3 _* j8 Y* @" ^) m. q* k$ A  ~). I* O) I4 n# S5 w& `- Y; L4 h0 P3 }
* G6 ?$ A# n/ Z2 R; p" g
把这个程序翻译成白话
( C$ ]( ?" L- J3 d+ U0 G& f. O(DEFUN C:HD()
. Q8 p, d! }# h% N
定义一个命令“HD”
$ ^; @$ s% y% C' ^- s6 j(setq b(getvar "osmode"))" f0 E! Y8 ?0 E! i& T' V
把使用者原来的对象捕捉设置保存为b' W3 R# l* V7 u7 T/ Q$ S' P5 s
(SETVAR "OSMODE" 32): j7 P- X& z- R7 l4 w
修改对象捕捉交点
+ L; w6 q4 l8 g1 `$ u9 W(SETQ a (getpoint "\n Select intersection to break: "))
; b, t5 G0 X$ Q) A5 P
在屏幕上指定交点: u" k0 `* J. \7 H
(SETVAR "OSMODE" 0)  ^* Y' F+ r4 M3 l! c' z
取消对象捕捉9 h" ~. @8 U; J6 R5 H& `
(command "break" a "f" "@-2,0" "@4,0")
: i5 |; o6 r/ p! m* C
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。
8 l4 U* t" E5 `; v' a5 ]. I7 c(SETVAR "OSMODE" b)
) h3 @0 t% Q( t' k) R
恢复使用者原来的对象捕捉设置
! `' k. _  O: j, ~)/ t3 ]8 V! B% z5 C( |0 ~
程序结束
5 K+ ?9 f5 s/ f0 W6 d9 `2 r" y; P  o0 l3 b
over
: h, r9 [. U" j0 d" D
, D* q& j8 e  l6 r) c) X
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作5 U* W9 P5 l2 @+ y! C: S- D$ Z$ t
那版主給加幾分呀
9 c6 J8 m7 t: k  t^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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