QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3882|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的# W0 R! `. d% w8 M  K6 V) a, c2 Z8 f8 _
' x& z& J+ S/ ?/ R6 ?/ c
基本凭感觉打断
发表于 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- {, l' k; j# N; ~8 i8 D/ \% n
我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???
( m) f: \' L1 C
! T. V% D' u7 u' s, ^7 L; {
据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:" R1 k  m- ~8 l# L4 x& q- [6 a& I7 R
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化4 E* X& r( N; A( u% w- r
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序
5 Q) V% D- Q* F# K
8 h$ l. S- Q& ~* B(DEFUN C:HD(), x7 Y8 @) Y8 I* j0 x$ X
(SETVAR "OSMODE" 32)
/ T3 x2 T, u3 y( @5 ?9 d: Y- F(SETQ a (getpoint "\n Select intersection to break: "))( M9 Z7 {% _/ r
(setq x (car a))
7 I- Z' F3 w9 ?4 ?4 A(setq y (cadr a))# S& m9 f& ^2 l& e, }; _) S
(command "break" (list (- x 2) y) "@4,0" "@4,0")
: [3 X! b/ ]+ U- m2 z(SETVAR "OSMODE" 231)
  x* O' U( ~# D)
  U% f9 \% `" I
1 K# b7 |, @0 Y. C$ E- o断开距离为两边各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
3 q. F1 V! L7 d% u6 b! |! l7 m相交线横断程序
  E9 ?9 ^# i7 l& ~; ^# O! I. L, X; Q
  u/ E& |9 {' |0 \' b3 b(DEFUN C:HD(); x; J+ }# {" F) {" h
(SETVAR "OSMODE" 32)
! W1 r3 D: ~/ {/ }: H3 ^(SETQ a (getpoint "\n Select intersection to break: &quot)" \# o( U: [& X
(setq x (car a))( X5 r/ Q1 @! y% Y
(setq y (cadr a))$ ~% M" h7 W8 }9 {: q( n: @: T  j
(command "break" (list (- x 2) y) "@4,0" "@4,0")
) W% G4 _, g$ ?(SETVAR "OSMODE" 231)! h( w/ Y: Q/ [$ V8 _5 d
)& y; I; A3 d2 M. `

8 y1 j( r' A: z) V* y: ?: D断开距离为两边各2,如果需要距离加大,可自行修改
1 k% I1 \! A) K( s2 r1 Y. ^

/ h, j5 r2 `5 V4 }  I" H; j楼主同志
1 o6 x% v9 {) U  J看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人, p% q6 q0 }5 \& f" e! s% |6 H2 L* `
6 n; @/ @/ Y- y. u. o

+ Y: |/ z% O; q, _; N悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
. N; }2 w3 T; f5 y
5 q" e- G6 i0 Y, ~( r* y8 w★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
) ^- ?2 q: [! x4 K6 m: t1 D
3 |/ e3 P+ s# G) @
" n' @) F4 b" E. |$ A% S
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗
' `" B# V% S+ F
* d. z% o- S) C. a

9 ^, Z  G2 a* j2 m, G我默默的点头titter
! c1 R& Q7 M' g) c/ w$ w9 r2 q4 k% J# ]. f$ b
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake : |0 n0 K% m1 y+ u6 x) P4 w, z

+ L- I* A% h; r# O6 G8 U; }

5 e- p1 S& w4 u+ X' W4 g. U+ a! d(DEFUN C:HD()1 x: k/ G: u5 u0 c; i2 a
这一行是在定义一个命令“HD”
* G: P% K7 p; I: H# M(SETVAR "OSMODE" 32)
5 r1 H. l% o5 r+ G+ M0 P' R2 V- ~
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
7 q5 Y- D& O' `. i(SETQ a (getpoint "\n Select intersection to break: "))
4 S: t6 [) }: X( {: [- D5 q
2 m8 z- J* W& t3 k
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )
0 I  O8 L3 X. K- Q2 q6 q" t3 L(setq x (car a))6 L% \  F) z6 ?# a4 d: K' b* E* O
提取a点的X坐标,取名“x”
2 y7 a# D5 u! i(setq y (cadr a))3 I# s% @! n$ n$ u/ K' Q
提取a点的Y坐标,取名“y”
; \0 I5 n7 r% G1 ~1 p(command "break" (list (- x 2) y) "@4,0" "@4,0")
9 G) {! @1 E; M) a
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车4 T3 J& U1 p; s
(SETVAR "OSMODE" 231)4 M3 d- G0 V3 l. @! K1 ]- H* ^
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
. \3 d( ~7 D( B)7 G/ u7 Y4 S. H& Y, a
程序结束
! d4 w/ |7 O# u% U2 j  K6 N% C* l+ `+ k3 O
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
% L% {4 M% C9 c5 T' }分析一下程序可以看出:让你见笑了:handshake
9 j% u" a: g9 D  \
2 M% V" X9 ?$ G; n8 z5 g3 L
  f: G) l. W; P' D1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )- b' M2 _9 N1 T; p# ^$ m
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"完全是多余的。(看看我这智商特低,理解对吗?/ `9 s5 V$ Y9 N0 |% i

  A9 X7 y& w/ ]* [0 Y6 ]# ?& s; r& x% [: N
/ S! J+ ?4 J8 _9 M& P) M' x7 L
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
$ U! S% q: p4 `
2 S' A5 q3 i+ W4 l
/ l1 U; K7 ~5 R4 M  ~这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
; i# ]2 k5 R) k0 j7 ^+ z
" g% j: s8 l4 R/ m" t
0 |- U1 _; D) b& a7 l
/ p% r: Q8 T4 a) x! K5 _1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。; }! J+ e2 [2 q$ Z
2、修改后的程序:( e) D) L0 a, {. k$ ~1 E5 w! C0 E/ N
(DEFUN C:HD()2 K2 {$ S2 K( W1 s
(setq b(getvar "osmode"))
  m' H1 s! T4 o  _
(SETVAR "OSMODE" 32)
& X. Z! t% {. i4 E6 x# K! @(SETQ a (getpoint "\n Select intersection to break: "))

/ {$ T1 v6 d1 y; T4 y(SETVAR "OSMODE" 0)# A! q* a$ H  R5 d" X4 L. w( B
(command "break" a "f" "@-2,0" "@4,0")

+ h8 V" W) a) ]+ e4 G(SETVAR "OSMODE" b)% r$ P, P: u6 @% e
)1 l3 f  B" }& i8 z. Q- y
5 H6 _( K& x% h9 u
把这个程序翻译成白话
  o' L7 n  f  r0 ~1 V; J# S(DEFUN C:HD()
9 {: ?9 E5 o( |; W  ?+ V' U
定义一个命令“HD”
( |- |9 R- @. ~, L- {0 _: {5 a(setq b(getvar "osmode"))
4 s* ^+ G0 v  t% y$ V
把使用者原来的对象捕捉设置保存为b  e% S. D: d8 e# N8 X: [9 }
(SETVAR "OSMODE" 32)
  l6 }' I, w7 f$ N0 P
修改对象捕捉交点
0 x& Q- p. [1 V$ O, \4 j(SETQ a (getpoint "\n Select intersection to break: "))% R6 j5 l# }& I/ s; Y/ O1 R% ^' K
在屏幕上指定交点
$ ?) L$ Z' I( M9 x3 M: U(SETVAR "OSMODE" 0), r2 {3 r% h$ P9 ?+ y/ w
取消对象捕捉, ^. p; Z' z# Y* S6 Q
(command "break" a "f" "@-2,0" "@4,0")
2 `0 R; e) ]7 f0 L8 v
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。1 J) Y3 p; W  Z2 ^$ c1 r, k
(SETVAR "OSMODE" b)
' H+ q& z$ ]( {2 i, k' i# _
恢复使用者原来的对象捕捉设置! j' w- F$ C3 s1 Q' y  Q  I, f" }
)
- Y9 G+ N$ a& @  @+ s
程序结束( ?0 F- V) m# l$ r4 G# H
over

' ^9 a) X; }" q8 x9 S' }
* X* U; ^6 N2 Q
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作
$ B3 b/ w, t, k& w那版主給加幾分呀5 p5 r, g3 V  R+ _& {  b
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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