QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3901|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
: F' s3 E  T8 Z* A5 s. n+ A, F# U3 i* c9 X' I4 i: k; I
基本凭感觉打断
发表于 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
5 Y! G* S( R$ w7 |# d2 Z7 i/ @我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
6 }0 s, s8 X9 h5 V. Q; g2 v
0 h1 {3 T: p- m1 q% h
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:% F9 N; M% _% B- T: C! _
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化) L% n% d; K  F2 U
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
* C% S, K* n3 S+ k# {
: C$ O2 E. ~* f5 ]2 ?6 Q0 p(DEFUN C:HD()
5 @2 ]  m0 ]5 D% J: G$ }(SETVAR "OSMODE" 32)
: h# U3 g$ m' M7 N; b(SETQ a (getpoint "\n Select intersection to break: "))( e: `3 I0 F9 Z' B: y
(setq x (car a))
5 h. ?  Y  ^+ N. i! Z& l& N(setq y (cadr a))
! a& w& e8 b" {4 a(command "break" (list (- x 2) y) "@4,0" "@4,0")
/ `1 F, u/ X0 d$ t(SETVAR "OSMODE" 231)- `2 i: ]: k8 v0 m% E
); M0 [% i# B! U( ~! K8 A$ H% H
) A8 i" d% s7 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
& o2 b1 \1 E6 X" p1 N相交线横断程序* }7 n% {# q( [# R
, Q: y/ O/ H( |" r
(DEFUN C:HD()
; n, {) ^8 d) Q7 a' L(SETVAR "OSMODE" 32)' R: F2 F- b" a  u4 `4 l
(SETQ a (getpoint "\n Select intersection to break: &quot)
0 K! C0 U  Z3 Q1 C; |3 x(setq x (car a))
* z: l4 T1 }4 y) @6 K(setq y (cadr a))& Q1 e& ~) |- K0 t- p
(command "break" (list (- x 2) y) "@4,0" "@4,0")
- y' H4 @8 {1 L4 Q4 Z! x+ d) W1 }6 u(SETVAR "OSMODE" 231)( j  q$ P9 [, I( _$ S
)
3 @  v/ h% a( u# s! P/ s" H4 B2 x. _! U$ _& _$ Q5 B+ u3 r  w
断开距离为两边各2,如果需要距离加大,可自行修改

/ B( K/ c% h# t7 T- C4 F+ q# F8 P3 ^6 `% I
楼主同志
( x/ W; l; a* L) i* L看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
: S, t0 s2 {8 H( \! L9 J# G' O3 }% y; L) [- a# \8 o

0 \& E  c" q# G" p7 K悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
8 a2 t' b- U- T+ s8 ~+ ?
3 o" Z1 W9 [# O9 s/ e) t1 l$ @3 H★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★& i7 v9 i  N0 F

7 R6 g% z% |2 G* d
$ y) c# e! l5 S/ V1 o. `( I' k& d仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
. Y5 j" o5 |8 Z; m/ j0 [% `: A1 M! r: U( e6 f6 y

+ ^: {/ _. V6 ~3 q9 G1 i我默默的点头titter
, g5 Q3 O; ^6 G5 ^$ Y8 Z
* A5 O! Q# v( v8 B7 R( k$ B楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake
" e' [# x- ^# P1 S6 S$ p. Q
1 n. e# f/ [( G4 E" N

. Q" @) x  A+ m  \( r(DEFUN C:HD()& |. u1 ~# ]8 W( Z- l4 N! L9 ^7 Y- a
这一行是在定义一个命令“HD”5 O1 i) |& x% E2 c
(SETVAR "OSMODE" 32)3 F) s% K* E  Q, g5 h0 {- W
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
' d$ _6 w2 r9 ^' Z9 {% R& o(SETQ a (getpoint "\n Select intersection to break: "))

" _0 M- D: a# y- F* [. ~$ B! [: Q( h# L
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
. S" S$ S1 M3 }: g( ^(setq x (car a)), }3 J2 p* Q& P
提取a点的X坐标,取名“x”
( j5 d% g3 i6 w4 S8 ?" V(setq y (cadr a))$ U( G/ V3 i1 G2 [* X2 C
提取a点的Y坐标,取名“y”
9 Z. Y; J; T6 r: A(command "break" (list (- x 2) y) "@4,0" "@4,0")
. `: A* A# D3 `3 {$ j5 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”,回车2 @4 U. @0 V" t: S+ t
(SETVAR "OSMODE" 231)" r7 x$ Q! |, I0 R0 e
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足5 N' A# o9 A# o1 n/ i8 `% Y8 h; [/ |
)
* ~  n1 P. R& U) o
程序结束/ k; f6 |* p9 ]* W6 j* K/ k/ g; y. Q0 p

! y1 ~+ t1 A; C★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★+ h  F2 p3 u+ q% I
分析一下程序可以看出:让你见笑了:handshake
) Y) E. B5 e" q# Q3 b
% i1 B: o" s4 _% R7 C: l0 J: J- I3 d6 L, {
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )
  }1 J3 B2 R* _( k: x2(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"完全是多余的。(看看我这智商特低,理解对吗?
6 A! F1 _7 t8 n
8 g$ @7 B3 x& J% S9 y
0 A" `" @& w6 i$ k9 V0 N- n

2 l: ^8 o9 f( F% y: F★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
, A5 l  e7 Q7 p* o# a
" K0 ~. L, {* c# V, u/ e* n# D) V. H
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: 2 G& t( V7 F% y
) k- g* M4 V; {! ~: R3 j
. T9 t* Q, d* {; L7 ?
, a. o" t/ R3 k1 B3 }7 g9 ~+ ]: o; u& N
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
# T* D2 b* C5 ?2、修改后的程序:
$ B$ ?/ N$ j: c  `# I7 \3 V(DEFUN C:HD()
$ V( d, J/ ], g) v2 G7 |( [+ F(setq b(getvar "osmode"))
+ m7 G9 n$ k8 Z, L/ c0 D! `$ ~
(SETVAR "OSMODE" 32)! W$ Q3 l& T  h0 P+ F
(SETQ a (getpoint "\n Select intersection to break: "))
, k2 u  U- h' Q5 k
(SETVAR "OSMODE" 0)
6 R- ]9 O  _$ @(command "break" a "f" "@-2,0" "@4,0")
3 D2 N8 T  W! _3 A- S3 }! F
(SETVAR "OSMODE" b)- a8 d3 u; Y& W5 U- X+ W* z4 _
)
% E  v. c$ O( ~5 }+ s. m; E6 k9 d; b4 `
把这个程序翻译成白话5 R( i6 a  E0 A6 K: f
(DEFUN C:HD()
+ ~# o$ R, K3 R# N3 `
定义一个命令“HD”
3 a8 k& U( C1 y6 t9 t(setq b(getvar "osmode"))# L+ A# A7 G3 ?6 w; D7 _
把使用者原来的对象捕捉设置保存为b6 E' E! `( g0 g* C
(SETVAR "OSMODE" 32)0 ?4 m( \: q+ l" U* t# H" D# \2 u5 I
修改对象捕捉交点
5 \" I; s  r: `(SETQ a (getpoint "\n Select intersection to break: "))& }7 e6 v1 [" ]' k# `) ^
在屏幕上指定交点
* ]2 h6 \9 |+ m(SETVAR "OSMODE" 0)+ |. z1 e4 V5 o) W8 T
取消对象捕捉- j3 q. Q) A2 |- L
(command "break" a "f" "@-2,0" "@4,0")
* q4 S6 ?$ ]7 V
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。! u& q1 y8 o  ^% |& {7 I
(SETVAR "OSMODE" b)
/ }! L4 X  f. i" i  ]
恢复使用者原来的对象捕捉设置
& A1 Y& F/ ~" x& `7 @! t)& Y+ z1 x5 V7 n4 {+ a3 N/ u
程序结束1 y2 k6 k3 r; _: l% P5 i  B
over

9 y* n) H* s# d
0 @/ W$ k: T& T- g
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作( e6 @  Z) k8 G1 ^. Y% H7 e" [
那版主給加幾分呀
3 r$ V- }. o7 R0 n5 t^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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