QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3888|回复: 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 | 显示全部楼层 来自: 中国上海
似乎没有规定说要一样距离的! V. p+ S9 X2 L$ r' R
- G4 o3 T. g6 @" k& B8 p, u
基本凭感觉打断
发表于 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
; Q( a! W, ~$ ^; R! T2 Z1 p" P我们在画系统图时,当管线相交时应断开,线一般为直线或多段线,有没有这种程序,在很多管线相交处,统一按横向或竖向断开同样距离???

6 G% V6 K% e) B& k4 ?6 \$ G
4 M% C8 s2 Q1 k5 p9 ^0 K据说你的二次开发编写得不错,不防按照5楼的建议自己编写一个共享,这样一则展示自己的真实水平,二则给其他的会员学习的机会,何乐而不为呢?
 楼主| 发表于 2008-6-29 20:15:20 | 显示全部楼层 来自: 中国辽宁鞍山
回复“高山流水”:! t; E8 M) A  j0 c) E4 L
如果采用二次开发来解决这个问题,查找到交点后用命令断开容易实现, 但如何查找到交点,我还没有很好的解决办法,因为对象可能是线、多段线、圆弧、块等,类型太多, 不好判断
 楼主| 发表于 2008-6-29 20:19:17 | 显示全部楼层 来自: 中国辽宁鞍山
5楼说的情况我已完成了编程, 但必须一个一个的交点来选择, 无法用框选方式一次选中, 请教各位有没有更好的办法
发表于 2008-6-29 20:28:12 | 显示全部楼层 来自: 中国广东梅州
为什么要简单的问题复杂化8 N& M+ L9 y: [- R: h
CAD本身有点打断的命令,这个不是花瓶
 楼主| 发表于 2008-6-29 20:31:07 | 显示全部楼层 来自: 中国辽宁鞍山

相交线横断程序

相交线横断程序8 L9 Y( M) A8 S( |: x/ i, v) r2 ]
: e. v$ ]5 [) Y( t( M; \
(DEFUN C:HD()
( o/ F& T9 b, B$ G+ m(SETVAR "OSMODE" 32)
0 q# B: r" q& l0 i) y(SETQ a (getpoint "\n Select intersection to break: "))0 q7 q6 K* I7 B7 D
(setq x (car a))
9 a- o* }3 o: I1 F( H. D; z(setq y (cadr a))" _6 T: v- j0 g+ |2 V! T
(command "break" (list (- x 2) y) "@4,0" "@4,0")& h+ {5 q1 R, s: q
(SETVAR "OSMODE" 231)
6 m8 {. ~; `9 R! n% c* ~7 R)
/ C4 F; u7 @5 h9 o7 W) x' b( Q% ?/ p9 r7 w2 @
断开距离为两边各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
% Z+ T/ c  w$ B: H' `6 {) u5 ?  m相交线横断程序) C- R4 i& O8 G5 f
/ C1 a; w2 n  E% i* ^9 e
(DEFUN C:HD()
1 E! q# {& h. z+ k(SETVAR "OSMODE" 32)
& t7 B% i1 ?2 O  v7 C; X(SETQ a (getpoint "\n Select intersection to break: &quot)
( z% p! {: S+ w. [) Z0 k/ L2 M$ a- X(setq x (car a))2 ?) |7 K* g8 M' c4 l' a
(setq y (cadr a))- }, ]; I, U- r  E# G! N! j8 q# B
(command "break" (list (- x 2) y) "@4,0" "@4,0")( r$ s& h, L* r4 U0 u: _7 D3 f: X) g
(SETVAR "OSMODE" 231)
2 j! G% `5 d" P* ?. T# A3 n)
4 E! h. |( l( ^4 ]  h$ ]5 Y0 T: D' R
( C" i) \* F0 N/ ?( l断开距离为两边各2,如果需要距离加大,可自行修改
3 t8 u" J7 s7 n
/ v2 k/ w- N9 d3 P" X
楼主同志 " U& V4 v/ g, x# e
看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人" g& ~3 M$ G% |# e, u: T* e9 B

7 u, }$ @9 I1 x$ T2 Y6 @5 ?2 t5 f$ W7 |1 A) \. w# c
悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:9 }' J4 P& Q" _! C( {
- u# z1 [+ n  p! m3 E2 g
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  h! O8 m3 S4 N7 L- J

. W. k' s6 `; r$ x% v4 j- P% N7 A! P2 M
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗/ X  L3 Z. Z5 t

  t+ D' l" N1 k$ p+ d* W) e3 y! W
& D' q6 w+ j8 O+ g1 R/ e
我默默的点头titter - h. t% Y6 r8 [) {% a* g
6 C% I: A, b0 X) l: Y# ~
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake ) v3 S% @  ^% Z- s/ ?+ z7 H2 G

  Y3 d( F3 @8 `: _# Q6 s6 ]3 E; [# e

3 ?- `- b0 W- c6 N9 r) T(DEFUN C:HD()6 q5 K% w$ L1 c- p3 a+ N
这一行是在定义一个命令“HD”& H  y8 p( Z2 r8 w
(SETVAR "OSMODE" 32)3 p! M" g: R; e
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点
5 y' g) Q2 l( o9 u) p- T* R(SETQ a (getpoint "\n Select intersection to break: "))
; l+ c! j% @- D1 Z+ x8 c1 v% y' B
& Y; ^# L; e3 ^! W
这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter ); v/ D/ W  S0 d
(setq x (car a))
  H$ n1 n3 L, q" L. S; J
提取a点的X坐标,取名“x”! I4 r; Z( o+ C. ^. @: W
(setq y (cadr a))
2 J: p, A: j' Z; r' e2 W
提取a点的Y坐标,取名“y”" M1 F8 }/ P3 k' H
(command "break" (list (- x 2) y) "@4,0" "@4,0")

* G, N( u0 \7 W1 }' a& z/ E+ ^向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车
3 a; K, m1 H% G# m) ~(SETVAR "OSMODE" 231)
% I5 _2 M2 B( {5 L$ Z0 x
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足
+ I+ |/ ?7 ?4 |) m)
# K4 h: e8 w- S9 r0 j; \
程序结束* p! H' v0 i  u
4 l# T6 J4 L2 G% [0 Q7 O! d! Y7 a
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★$ [9 D4 T: ^& Y4 g/ t
分析一下程序可以看出:让你见笑了:handshake
' o7 e: |# O/ O5 O: d( X
4 _! ?- _; G  w' B( q7 m; Z4 g" X' {  Z
1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )  _' N: ]5 @- j+ U' o" `0 B1 `
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"完全是多余的。(看看我这智商特低,理解对吗?
0 F9 m$ g7 n$ |7 T2 q) ?4 n3 I+ c0 @+ J9 V: \  _) Q
9 L7 A# S4 B3 x/ {

& f& I( `2 Y# y: T, p0 ?) g★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★) o& P  D6 p7 ~: X

0 m% y2 }" M: z0 w: m) G
- r5 j7 e* j4 @7 L0 t) b; [这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol: " h3 M' H4 G9 }& Q
/ s. J2 l- J; C& K: |' m

6 |; [( Z3 Z: u7 k8 n0 C7 @. k. g- R  G
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。& \3 q% {" j4 {; c* ^
2、修改后的程序:
# a# @9 Q; @% O5 e9 f(DEFUN C:HD()
1 P2 {& F  D/ E" X(setq b(getvar "osmode"))
) E" {/ y8 t7 t
(SETVAR "OSMODE" 32)/ v) P5 u7 y; F4 P' \0 J
(SETQ a (getpoint "\n Select intersection to break: "))

' R9 k; a  N9 S; C7 ^, K- J# n& B(SETVAR "OSMODE" 0)2 w" W& L1 E3 H1 E9 P0 C2 x
(command "break" a "f" "@-2,0" "@4,0")
8 t, e# c( t0 p, F
(SETVAR "OSMODE" b): J8 Y* C  Y3 C# D4 m; L
)
7 U+ j) l3 [% A
# T9 J/ h( ]& U
把这个程序翻译成白话0 t7 [2 D, X: [# W9 K! W
(DEFUN C:HD()3 T" S$ v9 F+ ^. R
定义一个命令“HD”0 f7 J: v( ~7 ^3 t( f$ a
(setq b(getvar "osmode"))
' t) f  x: A1 T
把使用者原来的对象捕捉设置保存为b  i1 z$ Y5 W' z. I
(SETVAR "OSMODE" 32)
7 b2 Q6 E! g9 A& R! c- v
修改对象捕捉交点* r& a, i' x$ ^1 z; Y5 ?% ^
(SETQ a (getpoint "\n Select intersection to break: "))
' k; Z6 J* k7 h+ ^6 Z: U5 e
在屏幕上指定交点
0 I% }; j2 n3 O. h  [% ?2 M(SETVAR "OSMODE" 0)
. t- P9 E+ q: u; o. r, z, \; ~
取消对象捕捉
% [- T3 ^3 t( r) ^; ?4 Z. E! l(command "break" a "f" "@-2,0" "@4,0")4 Y; o- @& f( U  x
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。  o4 j+ ?& N& J  ]! X3 Z0 `
(SETVAR "OSMODE" b)3 [3 |; B/ [# }# g5 {) f
恢复使用者原来的对象捕捉设置
, ~6 }! K$ [; ~- d)
- @4 s  _. h$ q0 ?0 U# ^, ^
程序结束
- ]  Z3 k9 o8 [& z: h
over
; d( ^4 p5 _" N

; c+ z! O9 g5 o: N
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作# P" V4 F6 w5 {+ a4 V* M
那版主給加幾分呀7 H( H1 }- A4 k! H5 g; H( U5 Z
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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