QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3887|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的( s' a/ Y3 t8 Z2 |; L" |, R

5 q( l' A1 b+ t# `# }基本凭感觉打断
发表于 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
- x3 e3 Y% C3 g我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
3 |" W% J- y, o+ u* g

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

相交线横断程序

相交线横断程序$ w; N7 s3 n5 h" G4 ?
( s/ Q5 v: Y8 r
(DEFUN C:HD()
5 a7 _" B9 R( \( D0 k' U+ N  c(SETVAR "OSMODE" 32)
$ U, f% d: g6 ?" c) `(SETQ a (getpoint "\n Select intersection to break: "))
# n( [% P* ~) e- L" ^9 ?(setq x (car a))
; A6 `9 f5 W5 L, l; ^3 S(setq y (cadr a))# ?+ K4 B- ?; x* V3 T  \7 g6 D
(command "break" (list (- x 2) y) "@4,0" "@4,0")4 U( D4 U5 }$ N7 T
(SETVAR "OSMODE" 231)
/ O$ `0 I* L: ~2 Y, v)! {$ ?; W4 q# \

$ ?/ r/ z/ n! s4 Y& ^( A断开距离为两边各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
( A  Q% S( C' ^( s2 u相交线横断程序7 j. W( W- }; p3 [/ L% X! b

. Q+ |7 x8 o4 D: M# h(DEFUN C:HD()
  n7 k/ X: ], G% x1 ?(SETVAR "OSMODE" 32)  u# N1 L2 L9 B# b6 S, D" F
(SETQ a (getpoint "\n Select intersection to break: &quot)
$ m3 @/ c* }: C  M" t(setq x (car a))
7 b! M% z4 c  G8 v2 _( L+ S- ~(setq y (cadr a))3 q" \5 x; k- Y0 m5 n
(command "break" (list (- x 2) y) "@4,0" "@4,0")
0 R8 {0 p  |7 }& w: ~(SETVAR "OSMODE" 231)& t4 j3 r5 m5 e0 |) I
)& V9 [' a2 n5 I3 C

* {6 K% h8 Y4 j1 R# h. t断开距离为两边各2,如果需要距离加大,可自行修改
, [% A" u, h* T  j

5 n$ D1 f# v7 u, ~' Z* @* t楼主同志 + @; d) D3 @+ _1 {6 z
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
, d( X# Q/ f- o$ \3 V/ h8 I1 e0 i7 X' `) G# M- P$ Y, s" i7 v
3 o" W/ k! X! Z6 y6 _
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:. n  r9 Y  Z" N
8 ~2 B" s* E4 X( r. ~% P
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
! B) g1 t; m; l5 M6 A! J9 z
8 c- M$ h7 `% i% z% r$ K5 L
/ U  F* y$ }& ^( }6 r
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
1 ^2 H( H) m$ r: F. Z) q" i+ C/ K' @. h0 Y. @3 r+ }' }9 N+ m/ i
+ v* s& B8 K! A! D2 [
我默默的点头titter - S3 I6 I; m$ S
; g. B* [4 W5 Q% g  i* ?
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake
. h3 u# g- ^7 U  y3 h( ~9 A! C$ u2 Z3 h8 D* D5 A7 @) ?! H

2 P3 c4 y! Q/ m: g) o# [) R2 k(DEFUN C:HD(). O4 N& e' D. d6 N: r
这一行是在定义一个命令“HD”7 j2 S  `8 L. l4 R
(SETVAR "OSMODE" 32)
3 M; @: B4 ~1 ?% I' f. @" `2 t( S
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
9 [0 G# p: M& o7 k(SETQ a (getpoint "\n Select intersection to break: "))
$ ^: I0 [% m! U4 G! c- {
7 v9 U; m8 O- A' P0 l% q+ [- s
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
  m* B  w  g$ P/ x( f9 b7 D6 P( d(setq x (car a))
6 A+ D, X( g& {) {; k
提取a点的X坐标,取名“x”
& E/ o, \4 i1 n; Y/ a- i9 L(setq y (cadr a))
8 R( z- t0 V1 U9 t3 J4 B& y
提取a点的Y坐标,取名“y”
. v2 O" T7 L; H(command "break" (list (- x 2) y) "@4,0" "@4,0")

+ q/ `- L  K2 m# b- x- h1 G" Y向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车' z+ s4 Z9 x+ m1 y
(SETVAR "OSMODE" 231); d* [6 R& |! s% d7 K
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
, A6 ]& x% E/ ?7 k" v)
+ P4 v5 A- B5 _+ ?, B1 m
程序结束
$ T& o8 ?( l) O6 L' E! N+ J% Q/ _6 `1 b$ g1 \( l6 K/ K" E5 \' x
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★) C# g: Z1 \6 N
分析一下程序可以看出:让你见笑了:handshake 4 }6 t7 O4 N7 l9 o8 W5 u/ H6 i

' `4 E/ K9 I" J6 S6 [' D( E1 u9 T8 B9 t8 w' C
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )) s7 R1 {& V& J& M3 B
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"完全是多余的。(看看我这智商特低,理解对吗?
# j) }, n9 z4 }( Z, o" w- ?1 s1 g6 |' U3 X- C& M; j5 A- @

9 u1 S4 g* K6 M/ K$ u0 H' |
$ s- c8 `5 [* v* j
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
3 h' P/ n  m  v/ M3 L* c, m5 A
5 Z( T% k: E0 B. b- U4 Z
0 ~. N- ^5 [# E! q7 |/ l- ]# `7 ^8 F这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
9 C- r7 X: d& C6 j" U* y. N% `6 W3 X9 e% f

' n: l+ s4 M# {6 L" c4 v) m
3 }9 T8 n" t7 b* Y, g/ t1 k6 p5 z1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
; s5 K6 w5 }9 S. G, r0 p; g1 O2、修改后的程序:2 A0 B- V7 e, Y9 Z$ P) w
(DEFUN C:HD()
' ~) G8 r2 m; T(setq b(getvar "osmode"))
! d! |% q8 i8 r# \2 C3 u/ e& q
(SETVAR "OSMODE" 32)
, I5 x( [& C. m# c5 T(SETQ a (getpoint "\n Select intersection to break: "))

0 a/ Y6 p3 O7 L* S7 N+ g( f(SETVAR "OSMODE" 0)9 l5 [* I4 F; l9 r8 R5 X, m, v
(command "break" a "f" "@-2,0" "@4,0")

6 ~* G8 X* H: M# C2 @* R( L8 J(SETVAR "OSMODE" b)
  r9 v7 c' d% W# C- v- B)
' t  q# a1 i; q! K; }$ g8 o4 ]2 L" q7 Y+ K
把这个程序翻译成白话/ ?- K7 h  s3 c6 M3 y
(DEFUN C:HD()
9 S$ e1 N: t5 Q) n, }( F' ~! T
定义一个命令“HD”- a  u4 i/ q/ h
(setq b(getvar "osmode"))2 n3 R3 _+ G$ B4 N' _3 s
把使用者原来的对象捕捉设置保存为b  k; R! O. q; R, d
(SETVAR "OSMODE" 32)
) B0 Z+ ?7 p8 o  j( M4 B
修改对象捕捉交点) P3 @! C: i" B- j
(SETQ a (getpoint "\n Select intersection to break: ")); R1 p) @* B7 F- J& P; G
在屏幕上指定交点* S& S, C* S; i% G
(SETVAR "OSMODE" 0)) x  ~3 E: A9 ^4 T
取消对象捕捉
4 @" W6 Z2 D8 }(command "break" a "f" "@-2,0" "@4,0")+ a) P: z' B$ g7 ]
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。0 I5 _* C) U2 P* i
(SETVAR "OSMODE" b)
& D9 _, }3 A9 a) ]& j: L* [- f
恢复使用者原来的对象捕捉设置
) V( W% {" L" W); C+ G! ?/ L$ L1 H" v) Q
程序结束# q6 r: E2 X- S4 U  A; a
over
0 n& f% ]9 B* K5 J
/ D3 b" \# q2 G2 r4 u: z
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
4 D- m. X) F  B; Z" S/ K9 Z那版主給加幾分呀
3 A* n( w5 u7 X9 p^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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