QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
3天前
查看: 3903|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的5 _; T, L8 ?' D1 j' |
* @5 t0 `& f1 [, `7 S9 K
基本凭感觉打断
发表于 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
' F$ n" `: H* R4 Y我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
6 b7 \0 i* @- X; w1 [2 E3 K
7 J, G4 d6 N* I9 I# ]% h
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:
7 C+ V% G# L( P! o1 e$ \% v如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化: O8 \. u1 l  p( R
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
2 y. r$ M; a' q! j
' }/ M6 L. [  S6 C, D(DEFUN C:HD()
4 T: d  c& H7 d1 k8 x(SETVAR "OSMODE" 32)/ P4 F( T( i: J3 Z9 P, ^
(SETQ a (getpoint "\n Select intersection to break: "))
8 q% L; W7 v' e+ E1 A; g(setq x (car a))% `5 o( K  j0 z0 _8 Y5 P; J: ]
(setq y (cadr a))
# P/ D4 a# v4 y  q+ a, T  e$ H" b(command "break" (list (- x 2) y) "@4,0" "@4,0")8 m6 T/ {- v( |. ]. Y, o. }* V9 E
(SETVAR "OSMODE" 231), ^, ]- t% e# `+ _+ l
)% J7 b+ z/ H' i% n* i9 Y8 e

1 V1 I, M: {0 ^/ m/ H; _* _! J  s断开距离为两边各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
# G2 s% P6 z/ t( H8 J相交线横断程序
. D* k$ a8 v  G7 W  K$ @
* f$ T+ W3 ]* Q% Q+ w- u) I(DEFUN C:HD()- J- U+ _5 o6 Q4 E
(SETVAR "OSMODE" 32)2 D& L- `9 m! h, i: C. _. {
(SETQ a (getpoint "\n Select intersection to break: &quot)
8 T# r1 X7 w' {& B: c, }(setq x (car a))+ v( F8 |' r, P$ W3 v
(setq y (cadr a))% }0 T  ]" K7 _# T7 H
(command "break" (list (- x 2) y) "@4,0" "@4,0")4 U( ?& Z0 k' S4 ~
(SETVAR "OSMODE" 231)
& R" i! Z- w1 X% M- L)
+ Y4 e1 I& }9 l6 |; f2 y. v# y( O0 t4 H- m' m1 i; l7 N
断开距离为两边各2,如果需要距离加大,可自行修改

7 R1 Y* C: |: C4 S$ `2 R) T0 f1 p  K
楼主同志 % S/ S$ ^/ L5 t* F$ o, p
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人
: ]: ^( C8 X4 m- o3 k, `5 B' y! X+ I
' A7 R# G, I& ?1 y; |3 x& i: o; A
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:: S  v! H4 \2 D/ A
2 c1 a* z  c' z' i
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★( X) _" S1 ]5 ?8 Z9 n
$ J- R. J& P& {3 \3 A0 F, k
  M  Z; d$ K$ M2 ?
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
  n5 j6 j9 i$ r+ ]* C. A& I
0 x7 n) i  _9 k
9 K  J( D- Y" l  i0 ]! W
我默默的点头titter / `" H! R, y+ f
& k# |" ^5 {0 o" ~$ g: T' O' F
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake
+ q# |) `: w# l: a: T0 r8 T8 s
$ i. B2 z' r3 @- o' H

- M2 C/ l. ^' @( v(DEFUN C:HD()
! f+ y2 s* ]  Z/ H8 J
这一行是在定义一个命令“HD”" I$ m* X# q: l2 W' d9 B4 F! F
(SETVAR "OSMODE" 32)( [! ^  Z. |: r' v/ V! k% _
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点6 ?. o3 A" M/ t4 _8 X
(SETQ a (getpoint "\n Select intersection to break: "))

2 I5 V0 J+ p) B4 g* ^; w
$ v( F4 l" P+ S& m& J这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )4 A+ p3 Y" F2 F7 S$ E' D/ F
(setq x (car a)), i6 Q$ Y2 X+ k
提取a点的X坐标,取名“x”) G/ {* o" M, u9 f5 N- H
(setq y (cadr a))
0 w" O' o2 M- _2 w2 a5 n
提取a点的Y坐标,取名“y”
; z& ~" N* Y$ i  _3 z+ H+ Z0 n(command "break" (list (- x 2) y) "@4,0" "@4,0")
! y- _6 \$ B2 e8 m
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车7 Y4 ~/ P8 v& D; b3 R* F
(SETVAR "OSMODE" 231)2 i# E. b% _! ]
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足1 P- M. ?$ ^5 W: U% `: {
)  M) `6 b& J8 Z) \$ n/ a2 _
程序结束' U: b6 t. O8 f9 s, L

$ \' M! |# f4 P( ?6 i( M+ L0 Y9 M★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★: A. P$ X  t. T- L, o* J
分析一下程序可以看出:让你见笑了:handshake ) ?) B8 g* g9 i  f8 Z
, B. A/ V& f! x6 ?( A# [
$ p0 @0 O5 y4 z
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )% N, m0 B9 l( K7 _8 H, _, 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"完全是多余的。(看看我这智商特低,理解对吗?$ [  ^$ Z& |7 b% M. i  ?+ s

- P7 [5 ~) t/ h- w7 W2 k
8 y7 n- C  P# k/ o* m/ P! k

! g: O# M& N' F! Z, H. r★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
7 ^) I: b- v2 R: W( e, S3 `9 l5 a- B4 k
( ^; Y1 Z4 a+ q; l3 k: A
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
! K! b* p7 i# D: L7 i  u$ Q
& z' F, W9 S  g1 W/ h$ f7 g/ V8 _* A$ j9 X
* p3 T  X$ g0 _* i* C7 ^
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。/ t) [" z4 P# _5 M
2、修改后的程序:
: B( m' o3 C0 P7 G( [, s* P(DEFUN C:HD()
1 L& ^9 y+ F& O0 L9 `3 }0 ]: T(setq b(getvar "osmode"))

* x1 j4 N. W; |9 q! U- ~1 F(SETVAR "OSMODE" 32)
3 F/ N; f" t3 Q4 T(SETQ a (getpoint "\n Select intersection to break: "))
- A1 l7 W- D* _7 R, P( X
(SETVAR "OSMODE" 0): F8 P( _9 R6 P- m
(command "break" a "f" "@-2,0" "@4,0")
6 S. h  f$ P- P  ^8 E& Z
(SETVAR "OSMODE" b): R. c/ w3 n- F2 K
)
) c; h0 w+ ~# `$ m) G
, ?9 V3 A7 D8 n1 \2 I' }
把这个程序翻译成白话
* M5 c& s8 m; |, E(DEFUN C:HD()
5 R1 S- o! H  a) k- v
定义一个命令“HD”* [( A% G2 H( z' @* v
(setq b(getvar "osmode"))& i: E; j7 P8 n/ m& L: v
把使用者原来的对象捕捉设置保存为b0 P) l# i0 g3 H& w# z
(SETVAR "OSMODE" 32)
2 D, v( G( E6 r1 K9 s$ j1 `7 H
修改对象捕捉交点
- U. M3 I# ^, s# s& P7 n, ], n( q  j(SETQ a (getpoint "\n Select intersection to break: "))
4 H0 ?0 k' ?" G+ Q2 L3 V+ P/ a3 o
在屏幕上指定交点
! H% q9 t  s" B% f5 O" H# y  V(SETVAR "OSMODE" 0)- A0 D4 @: y5 G) Q' A
取消对象捕捉+ s5 u3 i$ Z- [+ |4 Z
(command "break" a "f" "@-2,0" "@4,0"). F2 g% o( }( o5 Z! p) f: \
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。! N6 O7 H" Q0 ?6 x* v, B; h
(SETVAR "OSMODE" b)
& J: b: o) O  O- H" z7 E
恢复使用者原来的对象捕捉设置
1 B. [  c0 H7 a$ m+ q" |: a): _7 H  V6 V* H& |
程序结束* k  T6 K' V) F" o! O$ ^" J
over

9 x; L9 G. |  {+ i5 x1 z& i' E  Q' M7 b# @8 d1 q! b
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
' X. D+ Z( a6 P9 ?/ X" c那版主給加幾分呀
9 e+ i% C1 N& s& y6 K' Z^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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