如何用excel画楼梯?

如题所述

软件:

Office 2007


方法:

1、如果是楼梯的侧面图,可以全选文档---右键”设置单元格格式“将背景填充为白色,

2、之后,将单元格列宽缩小,之后选中两个单元格,填充黑色,向下,依次递增。

3、如果是正面楼梯图,可以将单元格列宽设置为16,行高30 ;之后右键”设置单元格格式“填充--填充效果---双色,颜色1为浅灰,颜色2为黑色,水平。

4、而后向下复制为单数。

5、之后,将双数行进行缩小,效果如图。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-05-04
作者:Clyde Wang
链接:http://www.zhihu.com/question/29024987/answer/43915171
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

虽然这和BIM好像没什么关系,但是还是简单回答一下吧,本人倒是做过几个CAD,Excel和word开发的项目,也不敢说多在行,但基本原理还是懂一些的,由于非计算机专业出身,所以语言不专业请见谅。上正文。
(对于本解答之中不甚理解之处,或是程序代码运行错误可以私信本人,本人将给与力所能及的帮助。)
===============================================================
其实做这个事情方法有三种:在Excel VBA上调用CAD,在CAD VBA IDE上调用Excel,在自己的平台上调用两者。不过但本质还是一样的,就是运用其他软件提供给你的接口把你想实现的过程接进去就可以了。

下面的一些图解和代码选自原来写的些论文,和您提出的问题可能没直接关系,但可以根据这些实例进行类比,也可以实现您需要的过程。

1 如何获取程序的进程
1.1 添加引用

这一步是多平台交互的基础,没有捕捉到目标平台的进程怎么能在目标平台上操作呢?所以为了实现我们的绘图操作或是数据读取,我们首先要捕捉当前的CAD进程或者Excel进程。这里我采用的是COM程序集的方法,虽然现在的CAD也支持.net的开发模式了,但...(好吧,我不会调用.net开发CAD)...

打开一个VB的集成开发环境(VB6.0,VisualStudio,CAD VBA IDE 或者 Excel VBA)这儿以Excel VBA作为开发环境为例。
在Excel的[工具]中单击[宏]选项,在子菜单中单击[VisualBasic编辑器]即可打开VB编辑器,单击[工具]选项中的[引用]打开以下对话框,将上面所述的两个组件勾选便成功添加了对CAD的引用。
<img data-rawheight="334" data-rawwidth="437" src="https://pic4.zhimg.com/3804d8983f280519426e03bba673cabf_b.jpg" class="origin_image zh-lightbox-thumb" width="437" data-original="https://pic4.zhimg.com/3804d8983f280519426e03bba673cabf_r.jpg">图1 添加工程引用图1 添加工程引用

引用了以上的两个COM组件后,我们就可以开始调用CAD的一些对象和命令了。

1.2 获取COM对象

AutoCAD在COM组件中的架构如下图所示,要想在CAD的模型空间中进行操作则必须先获取CAD应用和模型空间所依附的文档。
<img data-rawheight="213" data-rawwidth="720" src="https://pic1.zhimg.com/635dacf8438925566c4b84958dbf163c_b.jpg" class="origin_image zh-lightbox-thumb" width="720" data-original="https://pic1.zhimg.com/635dacf8438925566c4b84958dbf163c_r.jpg">图2 CAD的结构图2 CAD的结构

具体实现获取模型空间的代码如下:
首先定义变量:
Dim myCADapp As AcadApplication

Dim myCADdoc As AcadDocument

Dim space As AcadModelSpace

在过程中输入以下代码即可得到AutoCAD进程:
On Error Resume Next

'如果当前有CAD正在运行,则捕捉当前程序进程

Set myCADapp = GetObject(, "AutoCAD.Application")

'如果当前CAD未运行,则创建一个CAD的程序进程

If Err.Number > 0 Then

Err.Clear

Set myCADapp = CreateObject("AutoCAD.Application")

'此时创建的CAD进程可见性为[假],需将其改为[真]

myCADapp.Visible = True

End If

myCADdoc = myCADapp.ActiveDocument '获取当前活动文档

space = myCADdoc.ModelSpace '获取该文档的模型空间

获取了模型空间,我们就可以对模型空间里面的图元进行一些操作了。

2. CAD自动化绘图的基本原理

2.1 利用代码控制CAD的基本原理

如果我们打开对象管理器,我们会发现其实CAD提供给我们的所有的类、接口和他们派生的一些方法,函数在结构上和CAD的交互界面设计的结构是一个样的,也就是说,比如,UI里一个文档有好多图层,你就可以在AcadDocument里面找到AcadLayers这个对图层进行管理的类;同样你在模型空间里面可以添加各种图元,你就可以利用AcadModelSpace派生的各种Add***函数来添加图元。本质来说,在你不需要一些智能算法辅助的情况下,其实我们的程序无非是把我们手工过程等效成了一个自动化的流程,其实也没啥区别,只是人家计算机处理的比我们手工的要快多了。
<img data-rawheight="173" data-rawwidth="645" src="https://pic2.zhimg.com/b4d6bb6d0b3dd7df5df58836d2121c19_b.jpg" class="origin_image zh-lightbox-thumb" width="645" data-original="https://pic2.zhimg.com/b4d6bb6d0b3dd7df5df58836d2121c19_r.jpg">图3 CAD代替人工实现自动化的基本原理图3 CAD代替人工实现自动化的基本原理

2.2 向模型空间添加一个图元

理解了这个,我们就可以尝试去向模型空间中添加一条线了。

AutoCAD的界面操作中,用户需要指定两点,才能生成一条直线;同样对于外部程序,想在AutoCAD中生成一条直线,除了调用生成直线的命令外,还应给予必要的参数(对于直线,就是两个端点),实例如下:
Public Sub AddLine()
' 定义起点和终点并给其赋值
Dim StartPt(0 To 2) As Double, EndPt(0 To 2) As Double
StartPt(0) = 0: StartPt(1) = 4: StartPt(2) = 3
EndPt(0) = 2: EndPt(1) = 3: EndPt(2) = 1
' 定义直线,并赋值 #另:ThisDrawing是本地全局变量,代指本工程文件
Dim ln As AcadLine
Set ln = ThisDrawing.ModelSpace.AddLine(StartPt, EndPt)
End Sub

需要注明的是ThisDrawing这个关键词只在CAD VBA中才有用,其他的平台还是得按照第一节给的方法捕捉模型空间,并赋予某个变量才行。
如果不出意外,运行完该代码应该就能完成添加命令了。下面是我运行得到的结果。

<img data-rawheight="205" data-rawwidth="187" src="https://pic3.zhimg.com/bb4cd1c2902272ff11b28b5ceffd80ee_b.jpg" class="content_image" width="187">图4 代码运行结果图4 代码运行结果

2.3 所以说CAD实现绘图的自动化该怎么做

其实非常囧的就是,如果是一次性的任务,运用这种自动化程序的效率其实并不高,因为它需要将所有关键的点的坐标都表达出来,而且还时不时蹦出个bug...但没办法啊,程序就是这样的...比如要绘制一个倾斜的矩形,首先就是要把这个矩形的长宽及中心的表达式算出来,然后绘制一个直立的矩形,然后通过它派生的Rotate函数将它旋转。(说白了,和CAD界面操作基本上还是没啥区别的,而且...有些操作在界面上完成好像还更简单啊!!!=-=伤不起)

给一个画歪着的矩形的一个代码段吧:
主程序如下:
Public Sub AddRect()
Dim StartPt(0 To 1) As Double
Dim EndPt(0 To 1) As Double
StartPt(0) = 0: StartPt(1) = 0
EndPt(0) = 2000: EndPt(1) = 4000
Dim Rect As AcadLWPolyline
Set Rect = RectAngle(StartPt, EndPt, ThisDrawing.ModelSpace)
Dim Centre(0 To 2) As Double
Centre(0) = 0: Centre(1) = 0: Centre(2) = 0
'旋转多段线LWpln
Const Degree = 3.1415926 / 180
Rect.Rotate Centre, 30 * Degree
End Sub

自定义函数如下:

Public Function RectAngle(Point1() As Double, Point2() As Double,
_Space As AcadModelSpace) As AcadLWPolyline
Dim Pt(0 To 9) As Double
Pt(0) = Point1(0): Pt(1) = Point1(1)
Pt(2) = Point1(0): Pt(3) = Point2(1)
Pt(4) = Point2(0): Pt(5) = Point2(1)
Pt(6) = Point2(0): Pt(7) = Point1(1)
Pt(8) = Point1(0): Pt(9) = Point1(1)
Set RectAngle = Space.AddLightWeightPolyline(Pt)
End Function

运行出来大概就是这个样子了:
<img data-rawheight="574" data-rawwidth="594" src="https://pic1.zhimg.com/115d0f738b7cee3c09227187e0650cc4_b.jpg" class="origin_image zh-lightbox-thumb" width="594" data-original="https://pic1.zhimg.com/115d0f738b7cee3c09227187e0650cc4_r.jpg">图5 代码运行结果图5 代码运行结果
基本上简单一点的CAD的自动化也就是这样了,把所有的关键点的坐标求出来,写好每个图元的表达式,然后把参数接进去,运行。就完了...

3. Excel
忘了说Excel,其实Excel比CAD要知道的少许多,因为基本上如果你只将他做一个数据来源的话,记着一个sheet派生的cells属性就足够解决所有问题了。(毕竟是有了单元格里面的数据)
Excel的捕捉和CAD差不多的,引用的话就引用下图的这么几个文件就可以了。(哦,我用的是WPS,MS的Excel引用文件名和这个是不一样的~)
<img data-rawheight="428" data-rawwidth="592" src="https://pic2.zhimg.com/af6752017cb77503fbf440856c38a555_b.jpg" class="origin_image zh-lightbox-thumb" width="592" data-original="https://pic2.zhimg.com/af6752017cb77503fbf440856c38a555_r.jpg">引用之后和CAD差不多,用GetObject函数捕捉进程,其中的那个ProgID改成“Excel.Application”就可以。捕捉了进程后,捕捉你想用的Workbook和WorkSheet,引用之后和CAD差不多,用GetObject函数捕捉进程,其中的那个ProgID改成“Excel.Application”就可以。捕捉了进程后,捕捉你想用的Workbook和WorkSheet,使用Sheet派生的Cells(单元格)来获取数据。基本上和Excel的交互也就完了...
================================================================
回答时默认题主的设计是二维的所以没涉及三维图元的添加和修改,但CAD自动程序在三维图形上的设计能力也是可以接受的。比如下图是本人在一个平台开发时利用软件生成的实体。效果也还不错。
<img data-rawheight="313" data-rawwidth="472" src="https://pic1.zhimg.com/d4de96fa3e2866574c81925fc633f1e8_b.jpg" class="origin_image zh-lightbox-thumb" width="472" data-original="https://pic1.zhimg.com/d4de96fa3e2866574c81925fc633f1e8_r.jpg">但是经过开发CAD后,基于对CAD的天生缺陷的理解,我非常支持题主多去了解BIM,并不是说三维的就一定好,而是BIM从软件平台上来说,已经比CAD要高许多了。现在我也无心在去做什么CAD开发了,原因也非常简单,但是经过开发CAD后,基于对CAD的天生缺陷的理解,我非常支持题主多去了解BIM,并不是说三维的就一定好,而是BIM从软件平台上来说,已经比CAD要高许多了。现在我也无心在去做什么CAD开发了,原因也非常简单,当我想做的事情其实别人早就做完了,或者就算别人没做或者没做好,我也能在他通过的平台上通过了了百句的代码完成我的目标,而非像现在拼了老命写了上万句还只能实现些基础的功能,更可悲的是还增加了很多人为的限制。有时候我在想,牛顿的话也是至理了:
如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。

祝在BIM的路上共进!

Ps:

如果觉得我说的太啰嗦当然也可以参考这篇:
龙晓林,王国顺.使用VB应用程序调用AutoCAD和Excel软件的方法[J].武汉理工大学学报(信息与管理工程版),2001,23(4).
以及这两本书
曾洪飞,卢择临,张帆.AutoCAD VBA&http://VB.Net开发基础与实例教程[M].北京:中国电力出版社,2008.
佟士懋,邢芳芳等.AutoCAD ActiveX/VBA二次开发技术基础及应用实例[M].北京:国防工业出版社,2006(4).本回答被网友采纳
第2个回答  2016-05-05
要画成什么效果呢,如果可以的话可以用CAD画,简单也便捷,用EXCEL画楼梯不理解为什么这样做呢
但是也可以画好CAD之后再链接过去呢
第3个回答  2016-05-04