AutoCAD 判断图元交叉

‘本例演示判断两个图元是否交叉?有几个交点?交点坐标分别是什么?

‘绑定 AutoCAD
Dim I As Integer, J As Integer
Dim oAutoCAD As Object
Call BindAutoCAD(True)

‘打开并绑定文件 D:/Test.dwg
Dim oDraw As Object ‘AutoCAD 多文档之一
Set oDraw = oAutoCAD.Application.Documents.Open(“D:/Test.dwg”)

‘建立选择集
Dim oSelset As Object, oItem As Object
Dim TempName As String
TempName = SelName(8)
If SetExist(oDraw, TempName) Then oDraw.SelectionSets.Item(TempName).Delete
Set oSelset = oDraw.SelectionSets.Add(TempName)
oDraw.Activate

‘屏幕选择多个图元填入选择集,列出前两个图元之间交点的坐标
Dim IntersectPoint As Variant
oSelset.SelectOnScreen
‘Debug.Print “oSelSet.Count” & Space$(1) &”=” & Space$(1) & oSelSet.Count
If oSelset.Count > 1 Then ‘最少两个,但只认前两个
‘ Find the intersection points between the oSelSet(0) and the oSelSet(1)
IntersectPoint = oSelset(0).IntersectWith(oSelset(1), 0)
‘ acExtendNone Does not extend either object.
‘ acExtendThisEntity Extends the base object.
‘ acExtendOtherEntity Extends the object passed as an argument.
‘ acExtendBoth Extends both objects.
‘ Print all the intersection points
If VarType(IntersectPoint) <> vbEmpty Then
For I = LBound(IntersectPoint) To UBound(IntersectPoint) Step 3
Debug.Print “Intersection[” & (I + 3) / 3 & “/” & (UBound(IntersectPoint) – LBound(IntersectPoint) + 1) / 3 & “]:” & Space$(1) & _
IntersectPoint(I) & “,” & IntersectPoint(I + 1) & “,” & IntersectPoint(I + 2)
Next I
Else
Debug.Print “No intersection points.”
End If
End If

‘解除绑定,释放资源
oSelset.Delete
Set oSelset = Nothing
Set oItem = Nothing

AutoCAD 利用句柄(Handle)绑定图元

‘本例演示分多次绘制图形,而每次所绘图元与当前进程所绘一般无二,即,可以对其进行任何操作, 绘制图元的数据存储于 Dictionarys,下次从 Dictionarys 中读出数据加以利用

‘绑定 AutoCAD
Dim I As Integer, J As Integer
Dim oAutoCAD As Object
Call BindAutoCAD(True)
Dim oDraw As Object ‘AutoCAD 多文档之一

‘打开并绑定文件 D:/Test.dwg
Set oDraw = oAutoCAD.Application.Documents.Open(“D:/Test.dwg”)

Dim oLine() As Object
Dim LineCount As Integer
Public vPickPoint As Variant
Dim dStartPoint(0 To 2) As Double
Dim dEndPoint(0 To 2) As Double

‘在 Dictionarys 中查找 “Line”,并读取”Handle” App 的 “1000” 位码的值
Dim sTemp As String
sTemp = GetDicString(oDraw, “Line”, “Handle”)
sTemp = PurgeTerminal(sTemp, “|”)

‘确定起点
Set oUtility = oDraw.Utility
If sTemp = “” Then ‘第一次
LineCount = 0
vPickPoint = oUtility.GetPoint(, “选取线段起点!”)
dStartPoint(0) = vPickPoint(0)
dStartPoint(1) = vPickPoint(1)
dStartPoint(2) = vPickPoint(2)
Else ‘Dictionary 有数据则唤醒对象
Dim TempArray As Variant
TempArray = Split(sTemp, “|”, -1, vbTextCompare)
For I = LBound(TempArray) To UBound(TempArray)
LineCount = LineCount + 1
ReDim Preserve oLine(1 To LineCount)
Set oLine(LineCount) = oDraw.HandleToObject(TempArray(I))
Next I
Dim vStart As Variant, vEnd As Variant
vStart = oLine(LineCount).StartPoint
vEnd = oLine(LineCount).EndPoint ‘AutoCAD 特别之处
dStartPoint(0) = vEnd(0)
dStartPoint(1) = vEnd(1)
dStartPoint(2) = vEnd(2)
End If

‘绘制(或增加)线段
vPickPoint = oUtility.GetPoint(dStartPoint, “选取线段终点!”)
dEndPoint(0) = vPickPoint(0)
dEndPoint(1) = vPickPoint(1)
dEndPoint(2) = vPickPoint(2)
LineCount = LineCount + 1
ReDim Preserve oLine(1 To LineCount)
Set oLine(LineCount) = oDraw.ModelSpace.AddLine(dStartPoint, dEndPoint)

‘在 Dictionarys 中生成新的(或更新) Dictionary,建立 App 并为 “1000” 位码赋值
Dim lRet As Long
Dim sDic As String
Dim sApp As String
Dim sValue As String
sDic = “Line”
sApp = “Handle”
For I = 1 To LineCount
sValue = sValue & “|” & oLine(I).Handle
Next I
sTemp = PurgeTerminal(sValue, “|”)
lRet = SetDicString(oDraw, sDic, sApp, sValue)

‘测试一:统计长度
Dim dLength As Double
For I = 1 To LineCount
dLength = dLength + oLine(I).Length
Next I
Debug.Print “线段根数:” & CStr(LineCount)
Debug.Print “线段总长:” & CStr(dLength)

‘测试二:部分线段左移,部分线段右移
Dim point1(0 To 2) As Double
Dim point2(0 To 2) As Double
point1(0) = 0: point1(1) = 0: point1(2) = 0
point2(0) = 200: point2(1) = 0: point2(2) = 0
For I = 1 To LineCount Step 2
If I <= LineCount Then oLine(I).Move point1, point2 ‘1, 3, 5, 7
If I + 1 <= LineCount Then oLine(I + 1).Move point2, point1 ‘2, 4, 6, 8
Next I

‘测试三:识别屏幕所选图元
‘在 Dictionarys 中查找 “Line”,并读取”Handle” App “1000” 位码的值
Dim oSelset As Object, oItem As Object
sTemp = GetDicString(oDraw, “Line”, “Handle”)
sTemp = PurgeTerminal(sTemp, “|”)
Dim TempArray As Variant
TempArray = Split(sTemp, “|”, -1, vbTextCompare)
Dim iIndex As Integer
Dim TempName As String
TempName = SelName(8)
If SetExist(oDraw, TempName) Then oDraw.SelectionSets.Item(TempName).Delete
Set oSelset = oDraw.SelectionSets.Add(TempName)
oDraw.Activate
oSelset.SelectOnScreen
‘Debug.Print “oSelSet.Count” & Space$(1) &”=” & Space$(1) & oSelSet.Count
If oSelset.Count <= 0 Then Exit Sub
For I = 0 To oSelset.Count – 1
iIndex = IndexInArray(oSelset.Item(I).Handle, TempArray)
If iIndex = -1 Then
Debug.Print “选择了集外图元.”
Else
Debug.Print “选择了” & CStr(iIndex + 1) & “号线段.”
End If
Next I
oSelset.Delete
Set oSelset = Nothing
Set oItem = Nothing

二十四史简介——后汉书

《后汉书》九十卷,南朝宋范晔撰。范晔字蔚宗,顺阳郡顺阳县(今河南省淅川县)人。出身于一个世族家庭。他的祖父范宁曾任晋豫章太守,著《谷梁集解》一书。《十三经注疏》中的《谷梁传注疏》就是以《谷梁集解》为基础写成的。他的父亲范泰官拜金紫光禄大夫,加散骑常侍,是宋武帝刘裕的得力助手。他博览群书、潜心著述,作《古今善言》二十四篇。所以范晔有很深的家学渊源,一直以名门之后自居,生性孤傲,不拘小节,仕宦不甘居人后,著述也不甘居人后。以此成名,也以此丧身。
元嘉九年,范晔在为彭城太妃治丧期间,行为失检得罪了司徒刘义康,被贬为宣城太守,范晔郁郁不得志,就借助修史来寄托他的志向,开始写作《后汉书》。
元嘉二十二年,当他完成了本纪、列传的写作,同时又和谢俨共同完成《礼乐志》、《舆服志》、《五行志》、《天文志》、《州郡志》等五志的时侯,有人告发他参与了刘义康的篡位阴谋,因此下狱而死。谢俨怕受牵连,毁掉了手中的志稿,使《后汉书》只有纪传部分流传了下来。
在范晔《后汉书》之前,已问世的有关东汉历史的重要著作不下十部,范晔以《东观汉记》为基本史料依据,以华峤书为主要蓝本,吸取其他各家书的长处,删繁补缺,整齐故事,超越众家,后来居上。所以到了唐代,范晔《后汉书》取代《东观汉记》,与《史记》、《汉书》并称“三史“,盛行于世。而诸家《后汉书》,除袁宏《后汉纪》外,都相继散亡。于是范晔《后汉书》成为我们现在研究东汉历史的最基本的依据。
范晔《后汉书》的记述,起于刘秀起兵推翻王莽,终于汉献帝禅位于曹丕,详载了东汉一百九十五年的历史。

AutoCAD 从 Dictionarys 中读取数据

‘绑定 AutoCAD
Dim I As Integer, J As Integer
Dim oAutoCAD As Object ‘AutoCAD Application 本身
Call BindAutoCAD(True)
Dim oDraw As Object ‘AutoCAD 多文档之一

‘打开并绑定文件 D:/Test.dwg
Set oDraw = oAutoCAD.Application.Documents.Open(“D:/Test.dwg”)

‘在 Dictionarys 中查找 “New Dic”,并读取”属性” App 的值
Dim sTemp As String
sTemp = GetDicString(oDraw, “New Dic”, “属性”)

Public Function GetDicString(ByVal vDraw As Variant, ByVal sDic As String, ByVal sApp As String) As String ‘在 Dictionarys 中查找 “New Dic”,并读取”属性” App “1000” 位码的值
GetDicString = “”
Dim I As Integer, J As Integer
Dim XTypeOut As Variant
Dim XValueOut As Variant
Dim oDic As Object
Set oDic = vDraw.Dictionaries.Item(sDic)
oDic.GetXData sApp, XTypeOut, XValueOut
If Not IsArray(XTypeOut) Or Not IsArray(XValueOut) Then Exit Function
For I = LBound(XTypeOut) To UBound(XTypeOut)
If XTypeOut(I) = 1000 Then GetDicString = XValueOut(I)
Next I
End Function

二十四史简介——汉书

继司马迁撰写《史记》之后,班固撰写了《汉书》。班固,字孟坚,扶风安陵人,生于东汉光武帝建武八年。父亲班彪是一个史学家,曾作《后传》六十五篇来续补《史记》。《汉书》就是在《后传》的基础上完成的。和帝永元元年,班固随从车骑将军窦宪出击匈奴,参预谋议。后因事入狱,永元四年死在狱中。那时《汉书》还有八表和《天文志》没有写成,汉和帝叫班固的妹妹班昭补作,马续协助班昭作了《天文志》。班昭是“二十四史”中绝无仅有的女作者。
《汉书》包括本纪十二篇,表八篇,志十篇,列传七十篇,共一百篇,后人划分为一百二十卷。它的记事始于汉高帝刘邦元年,终于王莽地皇四年。
《汉书》的体例与《史记》相比,已经发生了变化。《史记》是一部通史,《汉书》则是一部断代史。《汉书》把《史记》的“本纪”省称“纪“,“列传”省称“传”,“书”改曰“志”,取消了“世家”,汉代勋臣世家一律编入传。
这些变化,被后来的一些史书沿袭下来。
《汉书》记载的时代与《史记》有交叉,汉武帝中期以前的西汉历史,两书都有记述。这一部分,《汉书》常常移用《史记》。
但由于作者思想境界的差异和材料取舍标准不尽相同,移用时也有增删改易。
《汉书》新增加了《刑法志》、《五行志》、《地理志》、《艺文志》。
《刑法志》第一次系统地叙述了法律制度的沿革和一些具体的律令规定。《地理志》记录了当时的郡国行政区划、历史沿革和户口数字,有关各地物产、经济发展状况、民情风俗的记载更加引人注目。《艺文志》考证了各种学术别派的源流,记录了存世的书籍,它是我国现存最早的图书目录。《食货志》是由《平准书》演变来的,但内容更加丰富了。它有上下两卷,上卷谈“食”,即农业经济状况;下卷论“货”,即商业和货币的情况,是当时的经济专篇。
《汉书》八表中有一篇《古今人表》,从太昊帝记到吴广,有“古”而无“今”,因此引起了后人的讥责。后人非常推崇《汉书》的《百官公卿表》,这篇表首先讲述了秦汉分官设职的情况,各种官职的权限和俸禄的数量,然后用分为十四级、三十四官格的简表,记录汉代公卿大臣的升降迁免。它篇幅不多,却把当时的官僚制度和官僚的变迁清清楚楚地展现在我们面前。
从思想内容来看,《汉书》不如《史记》。班固曾批评司马迁“论是非颇谬于圣人“。这集中反映了两人的思想分歧。所谓“圣人”,就是孔子。司马迁不完全以孔子思想作为判断是非的标准,正是值得肯定的。而班固的见识却不及司马迁。
从司马迁到班固的这一变化,反映了东汉时期儒家思想作为封建正统思想,已在史学领域立稳了脚根。
《汉书》喜用古字古词,比较难读。