QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 3877|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的
. l! v! x* {. c" z! Y* ~
9 f) v9 j. l* l$ s基本凭感觉打断
发表于 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: B# M, s/ Q1 H( t
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
2 B0 Y8 f7 f) ]% L  X, v" {
* q- y8 A$ D5 A1 n
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:
7 ^/ k5 W: O8 k$ ^如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化
: R1 R7 }6 B& [- w) z  sCAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
8 H2 X  n3 M/ h% o+ h* [; L( x  P* E: N% X. h  g
(DEFUN C:HD()9 ?8 X8 a2 b: l
(SETVAR "OSMODE" 32)
  K+ s: x& m# P) {: p$ ~(SETQ a (getpoint "\n Select intersection to break: "))# i+ G5 x* W0 H* B
(setq x (car a))
# k( Y  P2 a( O! H$ P(setq y (cadr a))$ n* R1 M5 c* l
(command "break" (list (- x 2) y) "@4,0" "@4,0")6 P0 v) u1 b/ p& Y9 L# _/ E% Z3 A. J
(SETVAR "OSMODE" 231)
' X# J+ D/ Z' Z, i)
- A: V/ l) l( s) Z  J+ J  y  k8 t4 x
断开距离为两边各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
* e) I. c( l9 V  e8 c8 R$ g1 F5 Y相交线横断程序! g" \( ?0 N' Q8 y7 Q
' k3 R8 W& Y( b8 _1 h% ~+ H
(DEFUN C:HD()
3 I- F& ^1 q/ r8 ^(SETVAR "OSMODE" 32)
. a- }9 u% c' A" {) v(SETQ a (getpoint "\n Select intersection to break: &quot): s4 B* m- h# G3 P  B/ [
(setq x (car a))  J3 u- N, i+ m' Z
(setq y (cadr a))
6 \) e4 t$ S% l8 H- d$ J9 X(command "break" (list (- x 2) y) "@4,0" "@4,0")
0 f7 E9 G" f( y$ U! }3 C0 r! J+ F(SETVAR "OSMODE" 231)6 g: f8 P5 f; u4 X3 _& q6 c, p
); @  ^+ M  A/ K2 `2 x
5 N" T, x+ o* s
断开距离为两边各2,如果需要距离加大,可自行修改

  r- {# b  u, U: m* O0 F8 k
" Z0 G6 c+ Z- e4 G楼主同志
2 M% K+ b' j9 `$ d, r看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人/ p9 A; c+ U3 m/ M
) d& S( C# Y5 Z! f6 E! p7 j: r% W
( b4 x! q1 I% h, O
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:( Y& d- s+ o3 n9 t9 e
% J- d7 x2 S; o( |# N
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★0 O$ ~1 [: \( q. j
' J# Y5 R. R/ X7 ~/ X; J. e. }

- d/ Y/ E5 q4 e+ v% S4 h3 ]5 `  d$ b仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
9 p" o( \9 V) y; R" S' p& @5 p
& `+ R' k0 G3 c7 I9 C/ S& z
6 e1 x/ Z+ C' q9 I
我默默的点头titter 7 _2 ?: E  u, @
3 F$ E( h- t3 A# c/ ~
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake * v" \5 K3 ~" `8 j9 ^2 f; _7 x! q

9 h  r" a; y  k2 F
1 w! a  `- @& W7 i. s$ e
(DEFUN C:HD()
4 M& H) i" J2 l7 y" N# [# v% L4 R
这一行是在定义一个命令“HD”
1 t+ H  d: |. i8 A* K! S(SETVAR "OSMODE" 32)6 s$ p5 |/ e: R# u" v" `  _5 T! \
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点& N& M" h+ j+ ]. D9 d6 _9 s
(SETQ a (getpoint "\n Select intersection to break: "))

3 n+ @( }$ r  W& y2 L# |6 X4 ]8 v- ^4 f6 k  I5 u: ~
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
7 C4 [" {, m0 n' X* K, M6 J% h/ e(setq x (car a))$ V8 L' h  V5 b) N/ D. Q2 Z2 A. N8 M
提取a点的X坐标,取名“x”* P( V# z" f8 S% k4 h  \
(setq y (cadr a))
$ k5 q* a6 N" i" R
提取a点的Y坐标,取名“y”
8 L+ S; q8 m# ~! C5 R(command "break" (list (- x 2) y) "@4,0" "@4,0")
- v; q5 v) |( |: e( Q. e7 n0 j- H$ r
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车
+ P' K+ F. L) E4 f7 K(SETVAR "OSMODE" 231)/ q* y$ n* V, E; U& T
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足2 c$ t7 ]7 p- X
)
: A- x: ^% Y$ J! ?% t
程序结束1 p7 E& v2 w8 {/ r8 x9 f
6 G3 U% f( L" D4 D
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★( E' a+ h; I; c2 g
分析一下程序可以看出:让你见笑了:handshake 6 j$ e8 _, C. A% v9 {

3 m  u$ i( c0 ?9 `0 A! s2 E0 V# \9 u. |% f7 b5 A% U
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )* S. j0 b: q$ ^% J
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"完全是多余的。(看看我这智商特低,理解对吗?
; h5 X. a: f0 r
/ X  f' r; {$ H4 K5 A$ I" d! u7 Q6 a8 }0 Q$ i

) ?/ z6 |/ O% L! q5 J4 j- a7 N★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
" q3 i$ U* E7 w  r+ ~  i
$ @) f. b* Y' |2 H
5 g  a+ O1 U. }2 i6 X这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: ( I: H8 z7 ^2 D5 q9 h

2 L6 ~1 i: K9 ]6 H1 f+ a& k5 B* l0 {6 H1 E) b3 `8 i  k  {$ S
$ ^1 q" R8 S9 L8 i! L  u
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
- ?! j2 m) X% L% t; \" t4 V) h5 A2、修改后的程序:( n' t) k' S2 q
(DEFUN C:HD()
1 `# V6 t) x3 w(setq b(getvar "osmode"))

: w3 I4 i9 {* N( L* W* p) N9 c(SETVAR "OSMODE" 32)% M$ m1 x% d( G: F4 {+ M& F
(SETQ a (getpoint "\n Select intersection to break: "))
. f$ p" r! _5 w4 Y, K9 a3 r8 C
(SETVAR "OSMODE" 0)5 a, w8 B6 o/ X( f# A3 }
(command "break" a "f" "@-2,0" "@4,0")

9 A, J9 i/ n  |' z9 h. f(SETVAR "OSMODE" b)
1 J1 d! Q0 b& r)3 m9 H# c% k9 B+ U1 I, a& R
  z8 F$ `8 V5 o! Y: B. g
把这个程序翻译成白话( T/ Y& G3 l  [# L9 i
(DEFUN C:HD()7 j. n0 H) G* c1 i: r' U
定义一个命令“HD”7 \7 s( q3 E8 M( ]
(setq b(getvar "osmode"))
3 P6 @: u2 f$ I* k
把使用者原来的对象捕捉设置保存为b
3 p3 K9 P0 V. v- |(SETVAR "OSMODE" 32)' b1 U1 H7 p7 B  v0 F
修改对象捕捉交点
+ }2 J# `& E/ ]- I" K(SETQ a (getpoint "\n Select intersection to break: "))# G: f+ H; O5 |% \  `% t" q
在屏幕上指定交点- U+ H% O# U# l" f- X/ @/ ]0 V
(SETVAR "OSMODE" 0)
- J: i' ~6 P) b* K
取消对象捕捉% ?9 E) v* `3 Y6 ^. r
(command "break" a "f" "@-2,0" "@4,0")
+ ^& V' l" e3 U  J2 {/ B
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。# g. _9 w$ J$ k% K3 U! l
(SETVAR "OSMODE" b)% {; E$ k) ^# P! F5 r" r9 Y6 {8 w; v
恢复使用者原来的对象捕捉设置" G- V7 ]* N2 C" e: }  O* `. |
); [; {7 Q7 N' c. L/ @
程序结束
: V$ E: R: |  k% u2 ?
over
* |6 U# q; Z. L  |) E3 J3 V1 Y

) ^9 }0 L/ s" q
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作% ?# F4 a- {  X4 H
那版主給加幾分呀8 @2 X; c& ^8 G7 C$ K* ^! X' a
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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