QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

相交线横断程序

相交线横断程序
" J+ M6 }6 D6 y5 K5 h3 b/ _9 w8 O: Z
(DEFUN C:HD()1 o9 ?  s/ s  a/ W7 Q" a6 `
(SETVAR "OSMODE" 32)
  Y+ `! N8 n6 c, @3 O& @(SETQ a (getpoint "\n Select intersection to break: "))
' U7 n" h* u& U: g/ i7 e' x( f) @5 j9 c(setq x (car a))$ y5 q; V) l7 z% w  Z) f9 n. Y) W( G
(setq y (cadr a))0 K7 k( H8 `' G8 V6 y# ^& }9 t
(command "break" (list (- x 2) y) "@4,0" "@4,0")
8 M% h# {8 w( C(SETVAR "OSMODE" 231)
! r& Z- W. q9 G2 P8 v& z)
7 m5 L: \# }- ]; w4 f. T, l) D$ r. Z
断开距离为两边各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
( C8 b. Q1 ?* V相交线横断程序
  V$ J' F4 R; s$ g; H! I
) t, e6 \+ V: ]* X" i/ v5 b& G5 N(DEFUN C:HD()& q" I9 E! a9 F- n; \+ g8 H9 ^) t
(SETVAR "OSMODE" 32)
$ j9 R4 O" g: h$ l(SETQ a (getpoint "\n Select intersection to break: &quot)
! X+ ?1 B* J3 C9 A; C(setq x (car a))' p" z2 ^/ n! {$ H3 s7 q
(setq y (cadr a))2 x4 G# C3 x% u3 i
(command "break" (list (- x 2) y) "@4,0" "@4,0")2 m9 t& K1 U8 E) F2 S9 G* ]5 m
(SETVAR "OSMODE" 231)
  D# K& b$ x4 k6 S+ ~" _/ K% \)
6 ~( H9 u8 Z8 B6 D: t  Q0 Y/ M# r# Q3 }5 J9 U7 _1 s5 u; r
断开距离为两边各2,如果需要距离加大,可自行修改
1 o, V0 c! o: G6 V
+ G9 g5 M8 I% \2 r
楼主同志
; q8 F" i" l% A+ w* p看了你的大作,我喜忧掺半 ,喜的是三维有这样优秀的会员,水平之高目前没人匹敌good ,悲的是我这大老粗刚开始看不懂“Select intersection to break”这是吗玩意:lol: ,高人呀高人2 w% K9 _$ ^$ ^. W2 V9 o) @$ ?
- u8 \! `7 `; B5 Q! L$ r$ m

- y6 |2 o# ?! R& j悲喜交加使我彻夜未眠,转辗反侧时,一位仙人告诉我比着葫芦画瓢吗?titter 于是找来了葫芦分成两半开始了如下的诉说:
% A" ~5 v# C$ ]- G" K# v1 a7 t) I
0 w) e: F" Z7 [$ |* C3 b) b. J% o( i/ f★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
- O) a! B2 G) r! u! l& W7 {" E. J7 V
/ c* B. Z0 K* Y) Z; o' P
8 V7 z4 D6 Z% z1 R8 n2 M! ?8 [; h
仙人告诉我:“一楼的题目很大,解决的办法是有,但不是一两个人短时间内能完成的。这个题目有点像填充中的孤岛检测,要遍历所有有关的对象,分析所有可能的情况,CAD的填充在图形复杂时经常不灵,可能就是程序员没把可能的情况都估计到吧。别把简单问题复杂话吗4 D9 @! u& u" ^2 B& H

. ]+ D: f+ \% V$ j+ y0 v- z
) v/ u5 l0 U) q
我默默的点头titter 8 D! a* T8 X# H, n2 l
4 B) I* n/ g  M* E; Z8 ?& E
楼主同志,睡梦中将你的大作进行了白话解析,放在此处,供像我这样一点不懂的人去理解,不对处望能海涵:handshake . n9 W5 D% f8 M! F7 q- w' E
; X! F2 T  U! M8 A. _( |3 E

- q# e( ~6 ~4 R0 p- O) u(DEFUN C:HD()& t! Y: j3 O; V& h
这一行是在定义一个命令“HD”0 p! A) s3 P) K; B2 s# q
(SETVAR "OSMODE" 32), u& {! T# v8 V
这一行是修改系统变量“OSMODE”(对象捕捉)的值为32,即交点: E5 S6 Q) X& m  h/ l! M3 a: z! @
(SETQ a (getpoint "\n Select intersection to break: "))

0 I+ }: G. G: M4 z
7 p( Y  L- g: x  d3 i2 R这一行是在屏幕上指定一个点(即交点),并给这个点取名“a”“Select intersection to break:”是在命令行提示用户拾取点(英国历史我没学几天,不知道对否titter )* u. o. \6 K: D) S2 f# U
(setq x (car a))" ^& X. q* G0 f
提取a点的X坐标,取名“x”6 o, D7 l) H# F" R: [
(setq y (cadr a)). A8 Q. _% h& G8 Q& g
提取a点的Y坐标,取名“y”( C* N" y' c7 C. l8 c0 u
(command "break" (list (- x 2) y) "@4,0" "@4,0")
! f1 w% R" P! @) N1 l) H
向命令行发送“"break" (list (- x 2) y) "@4,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点左侧2个图形单位处指定点(“(list (- x 2) y)”是坐标(x-2,y)),命令行提示指定第二个打断点或输入“f”时在命令行输入“@4,0”,空格键或回车后又输入一个“@4,0”,回车
5 u+ h9 A& w  `) z# ^/ E9 r6 i(SETVAR "OSMODE" 231)
. z: M* n9 D+ U+ G9 n; x
“OSMODE”系统变量(对象捕捉)改为231,即“1+2+4+32+64+128”,即端点+中点+圆心+交点+插入点+垂足9 q8 b$ m: P; A; q  ]; H5 ~4 X; o
)
( \4 f* L+ I$ ~& n* h% c
程序结束2 p8 F; d  h( \# e1 @4 {% E
8 V. X% C6 C. b$ U4 D
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★6 I) I5 b# H+ H% K+ O/ b. k
分析一下程序可以看出:让你见笑了:handshake
! E& Y" o9 {! A2 t' q( Y, d' A
( o3 |: x1 O9 [
4 V6 _0 M/ \6 e2 m1(SETVAR "OSMODE" 32)对象捕捉改为交点后,在程序结束之前改为231,没有考虑使用者之前的设置是否是231。(不知对否?高人同志:handshake )/ X3 g) H. a0 F
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 l7 `% w3 H: o2 o
6 |& X6 o; Z: t7 G, n* V& m& |5 x" I$ J

: d, S! V+ D) }' e) k9 w! [! }3 ]) D★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
: I. N6 `# E# N" O/ C+ Z6 a
$ F7 u; |- ~" U0 C$ v* N. X. v! l2 v9 \% x: i4 R
这个程序如果不做大的改动又要求好用,可以这么做(不好用我也不再研究了,因为没有多大的实际意义:lol:
4 x, x' @: f6 _& s3 l$ b7 S! M; c. d# E4 z

! a3 ?* U4 @. Q( }8 p1 E! Q$ X  F* {
1、使用说明:要打断的对象必须处于绘图顺序的顶层;如果该对象是水平直线则在交点的左右两侧各2个图形单位处打断,否则在交点的左右两侧2个图形单位处的点向该对象做垂线的垂足处打断。
4 V" D9 o+ s" w: z2、修改后的程序:
1 |. [. |/ G' B4 \* b, ~(DEFUN C:HD()1 q. P% Y: w7 \
(setq b(getvar "osmode"))
3 z! n8 o+ l; `% Z+ W
(SETVAR "OSMODE" 32)0 z. W/ i' \8 E; x4 ?$ E3 G3 w/ Y
(SETQ a (getpoint "\n Select intersection to break: "))

: X" b, z) y! A* t" N(SETVAR "OSMODE" 0)$ R, x, j* [$ _. t- J
(command "break" a "f" "@-2,0" "@4,0")
( A. Z! _. X0 s5 q! `
(SETVAR "OSMODE" b)% O7 U( R2 q5 p6 Q5 u1 {
)& W/ N1 A5 G( e) W3 x* ~4 Z

$ w' s- O/ q7 i& }' {" P8 ^$ g
把这个程序翻译成白话
' D  R. I+ s& r8 [. H) y7 s(DEFUN C:HD()8 k! k" o5 M+ S- P8 Y" I" T
定义一个命令“HD”; r6 ?2 T% B8 {
(setq b(getvar "osmode"))2 f1 r+ E# ?. v4 v/ f% I0 m
把使用者原来的对象捕捉设置保存为b' C6 ^  s% B7 i5 J, ?. ]2 r, U% ~; a
(SETVAR "OSMODE" 32)+ S, c5 [0 Z  c  @8 [, z' b! x8 C
修改对象捕捉交点2 W5 Z' K  b- V: |! G7 E
(SETQ a (getpoint "\n Select intersection to break: "))1 `0 V# \& S  s' x- b0 V
在屏幕上指定交点( c$ l" ^( Q, L: ]) Q
(SETVAR "OSMODE" 0)
* [* p+ s7 o8 O+ o
取消对象捕捉
8 v+ J- ]2 w( X. h6 s(command "break" a "f" "@-2,0" "@4,0")- `1 q% \7 o$ R( @
向命令行发送“"break" a "f" "@-2,0" "@4,0"”字符串,相当于手工在命令行输入“break”,空格键或回车,命令行提示选择对象时在a点指定点(既然在a点左侧2个图形单位处不能保证正确选择,还不如直接在a点选择),命令行提示指定第二个打断点或输入“f”时在命令行输入“f”,空格键或回车,在a点左侧2个图形单位处指定第一个打断点,在第一个打断点的右侧4个图形单位处指定第二个打断点。2 l( O( k& s6 Q# R+ O1 c0 m& R
(SETVAR "OSMODE" b)  {# T0 Z$ [0 O% [7 `
恢复使用者原来的对象捕捉设置2 I" v: Z$ W$ s3 N6 t' K+ Z
)3 M2 Z0 e; ?( c7 n) h
程序结束3 a5 V( _. P) Z$ u7 G
over

4 i/ a' n, Z0 w6 D: h
" t  X* ~1 S: W( o% Q+ o
发表于 2008-7-1 12:31:36 | 显示全部楼层 来自: 中国台湾
既然是大作( N! s+ ~2 n  Y1 \6 m: D
那版主給加幾分呀; ^2 o/ H! ]( G& Q% b3 w# [$ P
^^
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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