QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3878|回复: 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$ f6 ?4 A6 v# e8 U; p9 X
4 ~0 `! @# ^% T' O6 s5 A
基本凭感觉打断
发表于 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.gif4 |" G7 A) [: b
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
* a' W# M% d2 Q7 h
& O; k: B! p. b
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:
, Z) P2 V* O* ~! {# y8 h如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化
, l" y7 {- \  C. M9 U0 vCAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
9 n7 E2 h( @; C& J) N9 N0 D+ k2 P0 V! n, H- e% d" P- I
(DEFUN C:HD()- W; K" [, @; V4 T
(SETVAR "OSMODE" 32)3 @# z  Q  F# ~, \) H
(SETQ a (getpoint "\n Select intersection to break: "))
7 S) `2 n1 W& H(setq x (car a))9 p& F+ y/ j: D
(setq y (cadr a))
/ \" J: O/ k3 y( x1 o; h, i6 E(command "break" (list (- x 2) y) "@4,0" "@4,0")8 {* Z+ i) B5 ^  m; o/ Q% m. e
(SETVAR "OSMODE" 231)1 Y1 _' C" ~* h- Q
)8 S$ X- u- I$ Q, _0 c

4 h8 g/ ~) q! W" l1 m. t$ k断开距离为两边各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. B& C$ k, p7 }- |: V' ?
相交线横断程序6 t' u' c- o+ C5 B1 i3 f
4 v/ G/ Q$ Z. L/ ^/ E- }; y
(DEFUN C:HD(). p2 a# A& X" l, i% K
(SETVAR "OSMODE" 32)- O7 M) Y( q' F6 N$ Q: G  y
(SETQ a (getpoint "\n Select intersection to break: &quot)
& g: Y( R3 c  ~, m( ~(setq x (car a))4 Q% u; y" P, I& }" |' H& U# U
(setq y (cadr a))$ K' w8 Y% g. T1 f7 X" T2 F
(command "break" (list (- x 2) y) "@4,0" "@4,0")
2 t, m6 y& q! W) E8 g(SETVAR "OSMODE" 231)
; _) Y( c0 u# S( Q)' v$ z/ a1 L4 d7 Q& e/ F' g

1 S- ~& a  t- ~0 a- h) I/ f断开距离为两边各2,如果需要距离加大,可自行修改
$ V! ]' W7 Z+ P/ G

/ z- Z: O( x4 L1 Z  u楼主同志 % e9 O6 V3 F& ~5 N; G5 e4 [
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人% B; u1 J' f$ X6 l
/ k3 E0 @+ T& s6 [

% h) ~5 o) n3 ^. z- U悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
0 f. N- `9 }, y! |4 V) d, g- o2 Y+ l1 W9 j) z  w
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★$ N2 x+ f) I, p4 Y8 h. M9 b8 ^& R4 C
* L9 K; l( W- l# c' P3 p

. _% X% H( z; _/ l. C; m+ C3 }仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
% `( ?+ R6 B6 [* R6 J& D# u4 O0 G; a# _, t/ p7 b" L

% ^7 q1 N6 A  S' ]3 T  `) v我默默的点头titter 8 b( ]! K+ F' a0 S; Z# Y' M

1 X% y* w5 q( o楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake 9 W2 V# V% p* _
" R0 K  f) B; p% v2 u
, a+ N" m  G+ v. w9 E6 S
(DEFUN C:HD()
& c& H4 b4 v! O7 @& ~6 E; K
这一行是在定义一个命令“HD”
1 f" c4 N* Z' {% V. O& A. o5 q(SETVAR "OSMODE" 32)% v9 {' V  X8 [
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点0 u' r1 D" K  R3 T% t
(SETQ a (getpoint "\n Select intersection to break: "))
7 @  b" Y, q8 A5 J/ ]& Z! i

! j2 n* ]3 \6 y/ Z  p7 e$ x+ L这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )0 z9 X1 C. J+ O/ H3 X1 m- P8 |
(setq x (car a))2 }5 j: B; N/ @; [
提取a点的X坐标,取名“x”1 N! r: {# g8 V0 b
(setq y (cadr a))
9 Z% C7 S! m- @
提取a点的Y坐标,取名“y”& Y" `. ?4 N8 P: r: S: ?
(command "break" (list (- x 2) y) "@4,0" "@4,0")

% b7 Z6 r8 d) i9 e) ?  X向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车+ Y+ ~, G8 y/ V3 {8 L! t2 J
(SETVAR "OSMODE" 231)# p& l# B# \; s1 v, u
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足$ w( f0 v$ ~9 I' n
)
3 d8 ~! |: y, y# T, d
程序结束
7 U5 q: i: ^; K, Q$ o: G+ v  }" D# Q- L- t, B$ @1 g
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
3 ^  {/ Z" i0 _分析一下程序可以看出:让你见笑了:handshake
# J+ ?' M3 u3 d2 Q, N5 ?3 _, K- s% k+ L* H

6 Z8 {9 K7 q; }& R1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )9 V7 L* w: R- D' h& ~, ^% ^
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"完全是多余的。(看看我这智商特低,理解对吗?
  a; \) Y- F7 y; ?- y) _/ I
) r: j$ B/ O$ Z3 f" z$ x6 e% O
* ?0 w' r1 ]/ g) S3 V
, c) Y6 _  Z2 W) |! U* q/ ^
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/ o6 j& w5 @5 J
, _4 W/ h* n+ O: ]# q# T" j
& U6 z4 N: z5 j! c
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: 5 H! D9 q7 f0 u: M9 \! t9 M

2 v* d" d) r" K+ i4 |; x' c1 ^
  e" L4 D2 B- ]) ~' V
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
/ P' I& l) S( J" [% [$ p7 g) M2、修改后的程序:  ?5 D; ?) U' f5 T6 T& Z
(DEFUN C:HD()/ J7 V$ S5 H. p4 x9 f0 t9 s+ t' o
(setq b(getvar "osmode"))
; I' c9 g! v2 {/ W' v  K
(SETVAR "OSMODE" 32)5 h3 e0 k6 w8 s- n$ Q
(SETQ a (getpoint "\n Select intersection to break: "))
5 ], r, U5 x8 ]0 f5 n3 ^4 _
(SETVAR "OSMODE" 0)
. y( ]/ b! @" _. m( K2 C(command "break" a "f" "@-2,0" "@4,0")
4 p1 }; D& e% d# k0 P  \
(SETVAR "OSMODE" b)
% u5 Y2 `  n/ t0 c; p9 q)
7 g1 J' ~5 P* n! V6 W
6 b0 E9 E/ U/ ]* t
把这个程序翻译成白话3 X( {! ]7 @6 _9 G- K; m0 ~  _
(DEFUN C:HD()  s9 C% V% p: p$ S3 z& ^" m
定义一个命令“HD”" l; v( k% S5 Z2 D
(setq b(getvar "osmode"))
: l: W$ {/ V0 r( B# ]7 z! M
把使用者原来的对象捕捉设置保存为b
* z8 N. q, j' F- @(SETVAR "OSMODE" 32)# c6 O6 N' q# x4 T% V' a& `; n% N( ?2 c. u
修改对象捕捉交点3 P7 t; o8 `  |
(SETQ a (getpoint "\n Select intersection to break: "))# O/ R) K7 ]# ?* ?' {
在屏幕上指定交点
3 {, w' _6 A1 q6 C7 i(SETVAR "OSMODE" 0)
; \3 }4 s$ ?- b$ ?* ]
取消对象捕捉
) Y$ {6 \6 ]/ P' @# r6 z(command "break" a "f" "@-2,0" "@4,0")
& e" ]4 Z% _* t' d
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。6 z8 B! s; s  e8 {( U
(SETVAR "OSMODE" b)
, R* g; `3 S, G7 K6 U
恢复使用者原来的对象捕捉设置
0 `2 ]% }; Y; Z)2 d3 n2 U. G  F' R6 l& K" I+ i
程序结束
+ B+ y* R: R6 A2 S  K
over
6 t% ]6 T$ D8 e, l2 y/ ]

7 K" |0 \: m7 b* R
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
: t) }# O4 a4 k. k& Y! y那版主給加幾分呀; m) A) ]+ Y! V; M, c0 W
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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