Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2326|回复: 6

[分享] 【探索的快乐之二 】- 模拟AutoCAD命令行形式绘制多段线

[复制链接]
发表于 2021-1-19 21:26 | 显示全部楼层 |阅读模式
本帖最后由 大灰狼1976 于 2021-1-21 19:23 编辑

【探索的快乐之二 】- 模拟AutoCAD命令行形式绘制多段线
注:此贴并非仅在本论坛发表,如有违反论坛公约请及时提醒,我会做妥善处理。


前言
    <这次的探索较上次要相对轻松一些>
    之前就知道EXCEL工作表中插入任意多边形(如下图的图标)时,可以通过录制宏得到代码,这些代码主体部分就是同一语句更改参数后的重复堆砌,完全可以把需要绘制图形的各点坐标数据放进表格或数组中,然后使用一个循环便能绘制一个符合要求的图形,这个非常简单,故今天的主题并非以此为重点。
    使用过AutoCAD的人或许有我有相同体会,AutoCAD绘制多段线和EXCEL中绘制任意多边形的手工操作方法极为相似,但是AutoCAD功能更为丰富,而且更重要的是,AutoCAD可以使鼠标操作和键盘输入命令行操作穿插进行,既能通过参数精确作图,又能直观看到每步操作后的结果,不像上面所说的一次成形看不到中间过程。
    那么在EXCEL里面,是否也可以既能通过参数作图,又能直观看到每步操作的结果呢,一次偶然的发现让我有了此想法,于是便和上次一样,开始了探索之旅。

PS:
    既然开始分享,那么基本已经初具雏形,之所以卖关子分段贴出,一是制作中间过程的示例需要时间,二是循序渐进的过程可能更具趣味性。
    1楼无示例。


logo.bmp
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2021-1-19 21:53 | 显示全部楼层
本帖最后由 大灰狼1976 于 2021-1-21 19:24 编辑

1、一次偶然的发现
    前面说过采用录制宏修改的方式,可以通过循环语句绘制目标图形,但是无法看到中间过程,即使单步执行代码,也只会在执行完“.ConvertToShape.Select”这条语句后才能看到最终图形,而这条语句是在整个过程的末尾位置,应该意味着绘图的终结,也即,绘制的时候不可见,可见的时候已终止绘制。
    我的习惯使我在任何时间任何环境下,只要有一个未解决的问题,就会有意无意地进行反复尝试,
某天我在调试代码时,脑里了浮现出一个想法,既然“.ConvertToShape.Select”语句执行后才能看到图形,那么我把它放到循环体中会发生什么情况,于是有了今天的第一个示例。

    注:本楼示例请单步执行。


Example1.zip

11.22 KB, 下载次数: 10

回复

使用道具 举报

 楼主| 发表于 2021-1-20 19:10 | 显示全部楼层
本帖最后由 大灰狼1976 于 2021-1-21 19:27 编辑

2、两个小问题的解决        
    如果测试了Example1的示例,应该可以看到,单步执行时,每一步都会显示出当前结果;而直接点击按钮执行时,虽然中间加了一个MsgBox中断执行,也无法显示出每一步的结果。
    既然单步执行有效而直接运行无效,我就认为是页面刷新的问题,果不其然,在“.ConvertToShape.Select”下面添加一句Application.Caculate后问题解决。
    可是很快又注意到两处不完美:
        一、有个选择框很难受,特别是在画水平或垂直线时,被选择框挡住看不清楚;
        二、每步操作都会留下一个完整的Shape对象,而且下一步的绘制结果会包含上一步的绘制结果。
    这次比较顺利,这两个问题都很快轻松解决:        一、通过测试,可以把“.ConvertToShape.Select”的“.Select”部分去掉,问题解决;
        二、循环体内加入删除Shape对象的操作,只保留当前绘制的最后一步结果,问题解决。
        PS:为了让各位直观理解第二个问题的现象,此楼示例将问题二的对策注释掉了。
              另,从此楼的示例开始,要注意绘制点与初始点重合时,图形会自动闭合,不用管,继续绘制就会取消闭合


注:此楼示例见附件Example2,不需要单步执行也能观察到每步绘制的中间结果。


Example2.zip

10.4 KB, 下载次数: 3

回复

使用道具 举报

 楼主| 发表于 2021-1-20 19:37 | 显示全部楼层
3、命令行形式输入指令尝试               
    在理论层面的问题解决之后,可以尝试人工指令介入,以命令行形式输入指令,EXCEL里面实现输入指令的最简单的人机交互界面就是InputBox了,所以在Example2循环体内添加InputBox相关语句,就可以模拟最简单的指令录入界面,而且InputBox可以设置显示位置,可根据需要调整,比较灵活。
    既然要输入指令,那么先要准备一个指令编码集,这个我就不沿用AutoCAD的指令集了,因为我本身对AutoCAD的指令集也不太熟悉,遵循我的极简原则,首先考虑到的是字母+数字的形式设置编码。
    初次尝试肯定选择最简单的图形,就是仅由线段组成的多段线,编码如下图(示例内也有)。       

注:此楼示例见附件Example3,可绘制最基本的多段线图形,InputBox无内容或点击取消时则结束当前绘制。

CommandList.PNG
line.PNG

Example3.zip

206.25 KB, 下载次数: 10

回复

使用道具 举报

 楼主| 发表于 2021-1-20 20:13 | 显示全部楼层
本帖最后由 大灰狼1976 于 2021-1-21 19:30 编辑

4、圆弧段加入,指令强化 (重大更新)
    步骤1到步骤3出奇的顺利,使我有信心增加线段以外的图形,AutoCAD画多段线时用的比较多的是线段与圆弧的组合,任意圆弧的弧度计算比较麻烦,所以我考虑加入半圆弧。
    与直接绘制一个半圆不同,多段线上延伸出来的半圆弧无法直接通过EXCEL的插入图形功能实现,我又不想使用多个图形的组合来模拟一条多段线,所以还是考虑通过代码计算来绘制,首先考虑到了以下的方法:

    一、在已知当前坐标的前提下,根据半圆的半径和方向计算出圆上各点的坐标然后通过循环,以绘制线段的方式模拟半圆弧,这种绘制方法有几个问题:计算复杂、生成的端点数非常多、端点数少时弧形不完美,毕竟是用线段模拟的圆弧。主要原因还是因为计算复杂,所以直接PASS掉。


    二、除了通过点坐标绘制圆弧还有什么方式?我看了一下EXCEL内置图形,有绘制曲线图形的功能,右击所绘制的曲线图形进入顶点编辑模式后,可以看到端点数较少,曲线的形状是由各端点的曲率调节杆(自创名词)来调节的(左击端点可看到),曲率调节杆是可以通过代码控制的(有幸录制到一次,大部分情况下录制不到),当然绘制时也可通过参数直接设置。

    第二个方法我认为是最好的方向,可以用最少的端点最简单的计算得到一段比较完美的圆弧,由于不清楚如何设置调节杆才能得到目标图形,先尝试手工操作,发现使用最少的两个端点时,无论如何调节,都不能得到完美的半圆弧,那么中间增加一个端点吧,手工调节后与标准圆弧进行匹配,观察效果良好。

    后面就是通过代码调试,这个调试过程比较繁琐就不多说明了,反正最后得到了以三个端点绘制较完美圆弧的各种参数。

注:此楼示例见附件Example4,功能已较完善,可绘制包含线段和半圆弧段的较为复杂的多段线。



lineCurve.PNG

Example4.zip

213.38 KB, 下载次数: 4

回复

使用道具 举报

 楼主| 发表于 2021-1-20 20:38 | 显示全部楼层
本帖最后由 大灰狼1976 于 2021-1-21 19:42 编辑

5、补丁1 (加入1/4圆弧)
    绘制简图时会用到直线、半圆弧,在某些边角上还会用到1/4圆弧,所以我应该把1/4圆弧的功能添加进去,这里我应该庆幸之前使用三个端点绘制半圆弧的想法,使1/4圆弧的实现几乎不需要修改代码。
    绘制半圆弧的指令已经有三个字母了,如果为了1/4圆弧再添加字母,显得复杂而且不方便记忆,所以我把1/4圆弧的绘制通过分段指令的形式实现,先输入一个字母“H”,按回车后再输入半圆弧的指令,可生成1/4圆弧,之后恢复半圆弧功能,也就是说,每输入一次字母“H”,只能绘制一次1/4圆弧。

注:此楼示例见附件Example5,增加1/4圆弧功能。

lineCurve2.PNG
CommandList2.PNG

Example5.zip

213.96 KB, 下载次数: 16

回复

使用道具 举报

 楼主| 发表于 2021-1-20 20:40 | 显示全部楼层
6、未完待续
    目前想添加的功能还有,但是细节上遇到些困难,先留个坑以后来填吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 07:58 , Processed in 1.217139 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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