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 中生成新的 Dictionary,建立 App 并赋值
Dim lRet As Long
Dim sDic As String
Dim sApp As String
Dim sValue As String
sDic = “New Dic”
sApp = “属性”
sValue = “467”
lRet = SetDicString(oDraw, sDic, sApp, sValue)

Public Function SetDicString(ByVal vDraw As Variant, ByVal sDic As String, ByVal sApp As String, ByVal sValue As String) As Long ‘在 Dictionarys 中生成新的 Dictionary 建立 App 并给 “1000” 位码赋值
Dim I As Integer, J As Integer
SetDicString = -1 ‘未执行
If Trim(sBase) = “” Then Exit Function
If Trim(sApp) = “” Then Exit Function
‘If Trim(sValue) = “” Then Exit Function
SetDicString = 0 ‘正常执行
Dim oDic As Object
Set oDic = vDraw.Dictionaries.Add(sDic)
Dim DataType(0 To 1) As Integer
Dim DataValue(0 To 1) As Variant
DataType(0) = 1001
DataValue(0) = sApp
DataType(1) = 1000
DataValue(1) = sValue
‘ Attach the xdata to the object
oDic.SetXData DataType, DataValue
End Function

AutoCAD 函数系列之一

Public Function SetExist(ByVal vDraw As Variant, ByVal sSet As String) As Boolean
Dim I As Integer, J As Integer
SetExist = False
If vDraw Is Nothing Then Exit Function
For I = 0 To vDraw.SelectionSets.Count – 1
If vDraw.SelectionSets.Item(I).Name = sSet Then SetExist = True
Next I
End Function

Public Function DictionaryExist(ByVal vDraw As Variant, ByVal sDict As String) As Boolean
Dim I As Integer, J As Integer
On Error GoTo ERR_NO_KEY
DictionaryExist = False
If vDraw Is Nothing Then Exit Function
Set oDictionary = vDraw.Dictionaries.Item(sDict) ‘试错
DictionaryExist = True
On Error GoTo 0
Exit Function
ERR_NO_KEY: ‘primary key
DictionaryExist = False
On Error GoTo 0
End Function

Public Function AppExist(ByVal vDraw As Variant, ByVal sApp As String, ByVal sDict As String) As Boolean
Dim I As Integer, J As Integer
AppExist = False
If vDraw Is Nothing Then Exit Function
If Not DictionaryExist(oDraw, sDict) Then Exit Function
Set oDictionary = vDraw.Dictionaries.Item(sDict)
Dim XTypeOut As Variant
Dim XValueOut As Variant
oDictionary.GetXData “”, XTypeOut, XValueOut
If Not IsArray(XTypeOut) Then Exit Function
If Not IsArray(XValueOut) Then Exit Function
For I = LBound(XTypeOut) To UBound(XTypeOut)
If XTypeOut(I) = 1001 And XValueOut(I) = sApp Then
AppExist = True
End If
Next I
End Function

二十四史简介——史记

《史记》最初没有固定书名,或称“太史公书”,或称“太史公记”,也省称“太史公”。
“史记”本来是古代史书的通称,从三国开始,“史记”由通称逐渐成为“太史公书”的专名。
作者司马迁,字子长,左冯翊夏阳人。生于汉景帝中元五年,大约卒于汉武帝征和三年。
司马迁的父亲司马谈在汉中央政府做太史令,负责管理皇家图书和收集史料,研究天文历法。司马谈打算编写一部通史,愿望没有实现就死去了。临死的时侯,嘱咐司马迁完成他未竟的事业。
司马迁幼年时就很刻苦,十岁开始学习当时的古文,后来跟着董仲舒、孔安国学过《公羊春秋》、《古文尚书》。汉武帝元朔三年,司马迁二十岁,满怀求知的欲望,游遍了祖国的名山大川,到处考察古迹,采集传说。通过对历史遗迹和西汉建国前后的史实的实地调查,司马迁开阔了胸襟,增长了知识,为后来编写《史记》作了很好的准备。司马谈死后,司马迁承袭父职,做了太史令,有条件看到大量的图书文献和国家档案,这对司马迁编写《史记》是一个不可缺少的条件。
汉武帝太初元年,司马迁开始编写《史记》。
天汉二年,李陵率兵随李广利出击匈奴,兵败投降。汉武帝向司马迁询问对李陵的看法,于是,司马迁说,李陵投降,是因为寡不敌众,又没有救兵,责任不全在李陵身上。汉武帝认为司马迁有意替李陵回护开脱,贬责汉武帝的爱姬李夫人的哥哥李广利。于是,把司马迁投进监狱,处以腐刑。三年后他被赦出狱,更加发奋写作《史记》。大约在征和二年,基本上完成了编撰工作。
司马迁死后许多年,他的外孙杨恽才把这部五十二万多字的不朽名著公诸于世。
《史记》是一部贯穿古今的通史,从传说中的黄帝开始,一直写到汉武帝元狩元年,叙述了我国三千年左右的历史。据司马迁说,全书有本纪十二篇,表十篇,书八篇,世家三十篇,列传七十篇,共一百三十篇。班固在《汉书·司马迁传》中提到《史记》缺少十篇。三国魏张晏指出这十篇是《景帝本纪》、《武帝本纪》、《礼书》、《乐书》、《律书》、《汉兴以来将相年表》、《日者列传》、《三王世家》、《龟策列传》、《傅靳列传》。后人大多数不同意张晏的说法,但《史记》残缺是确凿无疑的。
今本《史记》也是一百三十篇,有少数篇章显然不是司马迁的手笔,汉元帝、成帝时的博士褚少孙补写过《史记》,今本《史记》中“褚先生曰“就是他的补作。
《史记》取材相当广泛。当时社会上流传的《世本》、《国语》、《国策》、《秦记》、《楚汉春秋》、诸子百家等著作和国家的文书档案,以及实地调查获取的材料,都是司马迁写作《史记》的重要材料来源。特别可贵的是,司马迁对搜集的材料做了认真地分析和选择,淘汰了一些无稽之谈。对一些不能弄清楚的问题,或者采用阙疑的态度,或者记载各种不同的说法。
由于取材广泛,修史态度严肃认真,所以,《史记》记事翔实,内容丰富。

AutoCAD 从图元读取扩展数据(XData)

‘绑定 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”)

‘绑定 Microsoft Excel
Dim oExcel As Object ‘Microsoft Excel Application 本身
Call BindExcel(True)
Dim oBook As Object ‘Microsoft Excel 多工作薄之一
Dim oSheet As Object ‘工作薄的工作表之一

‘打开并绑定文件 D:/Test.xls
Set oBook = oExcel.Application.WorkBooks.Open(“D:/Test.xls”)

‘绑定已有工作表 Sheet1
Set oSheet = oBook.Sheets(“Sheet1”)

‘输入 App 名称
Dim sApp As String
sApp = InputBox(“Enter the app name of XData!”, “”, sApp, Me.Left + 1800, Me.Top + 2400)
‘sApp 为空表示所有 App

‘屏幕选择图元
Dim PointPicked As Variant
Dim oEntity As Object
oDraw.Activate
oDraw.Utility.GetEntity oEntity, PointPicked

‘读取扩展数据
Dim iType As Variant
Dim sValue As Variant
iType = DetachXData(oEntity, sApp, “Type”)
sValue = DetachXData(oEntity, sApp, “Value”)

‘指向 TargetRow 行第一列
TargetRow = MaxRow(oSheet) + 1 ‘有文字的最大行
oSheet.Cells(TargetRow, 1).Select
oSheet.Rows(TargetRow).NumberFormatLocal = “@” ‘文本模式

‘展示扩展数据
Dim I As Integer, J As Integer
For I = LBound(iType) To UBound(iType)
oSheet.Cells(1, GetColumnNumber(oSheet, iType(I), 1)) = iType(I)
oSheet.Cells(TargetRow, GetColumnNumber(oSheet, iType(I), 1)) = sValue(I)
Next I
For J = MinColumn(oSheet) To MaxColumn(oSheet)
oSheet.Columns(J).AutoFit ‘调整列宽
Next J

Public Function DetachXData(ByVal oEntity As Object, Optional ByVal sApp As String = “”, Optional ByVal sScope As String = “”) As Variant
Dim I As Integer, J As Integer
‘ Return the xdata for the entity
Dim XTypeOut As Variant
Dim XValueOut As Variant
oEntity.GetXData sApp, XTypeOut, XValueOut
If Not IsArray(XTypeOut) Then Exit Function
If Not IsArray(XValueOut) Then Exit Function
Dim iArray() As Integer
Dim sArray() As String
Dim vTemp As Variant
Dim iCount As Integer
For I = LBound(XTypeOut) To UBound(XTypeOut)
If Not IsInArray(XTypeOut(I), iArray) Then
iCount = iCount + 1
ReDim Preserve iArray(0 To iCount – 1)
ReDim Preserve sArray(0 To iCount – 1)
iArray(iCount – 1) = XTypeOut(I)
End If
Next I
‘IsMissing 只对 Variant 变量有效
If IsMissing(sScope) Or sScope = “” Or InStr(1, sScope, “Type”, vbTextCompare) > 0 Then ‘DataType
DetachXData = iArray
Else ‘DataValue
For I = LBound(iArray) To UBound(iArray)
For J = LBound(XTypeOut) To UBound(XTypeOut)
If XTypeOut(J) = iArray(I) Then
If iArray(I) = 1010 Or iArray(I) = 1011 Or iArray(I) = 1012 Or iArray(I) = 1013 Then ‘三维
vTemp = XValueOut(J)
sArray(I) = sArray(I) & “|” & vTemp(0) & “,” & vTemp(1) & “,” & vTemp(2)
Else
sArray(I) = sArray(I) & “|” & XValueOut(J)
End If
sArray(I) = CutTerminal(sArray(I), “|”)
Else
‘Nothing
End If
Next J
Next I
DetachXData = sArray
End If
End Function

为什么古人画像千人一面?

历史课本中的秦始皇、光武帝、诸葛亮、唐玄宗、颜真卿插图都长着一副相同的面孔,这些画像都取自《三才图会》。《三才图会》是由明朝万历年间王圻父子编纂的一部大型图录类书,其中很多肖像画、特别是明代以前的都像一个模版复制的,如夏启和商汤像,长得就像孪生兄弟,只是头饰不同和眉毛、胡须有些细微差异而已。

其实,不但《三才图会》如此,唐代阎立本的《历代帝王相》和清代的《历代帝王圣贤名臣大儒遗像》等古代名人肖像画集,也几乎千人一面。为何会这样?是画家画技拙劣吗?其中原因比较复杂,但主要原因可能是古代肖像画受到相术观念的深刻渗透。

对古代画家而言,掌握相术知识是必备的,宋人郭若虚《图画见闻志》中就称郝澄、牟谷等画家“学通相术”。元代王绎的《写像秘诀》是一部全面系统阐述绘画与相术关系的著作,他明确指出“凡写相须通晓相法”。在论述如何图绘人体器官时,使用的都是五岳、四渎、兰台、山根、印堂等相学术语。鼻子对应五行中的土,位于五官中央,因此王绎认为,绘制人物肖像应从鼻端开始。清代丁皋的《写真秘诀》进一步发展了王绎的理论,也主张从鼻子画起,他把人物面部分为田、由、国、用、目、甲、风、申“八格”。蒋骥《传神秘要》中也说:“一画两鼻孔,二画鼻准下一笔,三画鼻准,四画鼻。”这样,古代肖像画便在一定程度上程式化,不同身份和命运的人各有其形貌和气质特征。宋人康与之《记隐士画壁》记一画工谈绘画经验时说:“贱役……骨相当瞋目怒髯”;“清贵……骨相当清奇宠秀”;“帝王,骨相当龙姿日表。”《图画闻见志》卷一《论制作楷模》中说得更清楚:画人物者,必分贵贱气貌、朝代衣冠。释门则有善功方便之颜,道像必具修真度世之范,帝王当崇上圣天日之表,外夷应得慕华钦顺之情,儒贤即见忠信礼义之风,武士固多勇悍英烈之貌,隐逸俄识肥遯高世之节,贵戚盖尚纷华侈靡之容,帝释须明成福严重之仪,鬼神乃作丑䰩驰趡之状,士女宜富秀色婑媠之态,田家自有醇甿朴野之真。

由此可见,和尚、道士、帝王、书生、武士、隐士、贵戚、鬼神、农夫各式人等,其形貌、表情特征都有固定的模式。古代小说戏曲中的插图和人物形貌描写同样受到相术观念的深刻影响,我们阅读《三国演义》《水浒传》《说唐》等小说,会发现一个有趣的现象:描绘不同身份地位的人之形貌都有特定的词汇,如帝王将相无非是天庭饱满、地阁方圆、五岳朝拱、四渎分明、龙姿凤日、目如朗星、河目海口、鼻如悬胆、虎背熊腰之类的陈词滥调。《三才图会》和《历代帝王相)中的汉文帝、唐高祖、唐玄宗、唐太宗画像,还有一些小说中的插图,如《说唐演义全传》中的唐高祖、《赵太祖三下南唐》中的宋太祖、《平闽全传》中的宋仁宗,这些帝王的外貌皆惊人相似,都是额高颐丰,龙眉凤目,鼻大口宽,双目有神,是所谓大贵之相。相术将人的额和颏部比作天地,以圆隆丰厚为贵,尖狭塌陷则是贱相。

额、颏、鼻、左右颧五部分又称“五岳”,鼻为中岳,山不厌高,土不厌厚,鼻要高挺圆厚,忌窄窘偏塌;鼻、口、目、耳又为“四渎”,以深广为贵。孟子早就说过:“存乎人者,莫良于眸子。”眼睛是心灵的窗户,是一个人的精气神和品格的集中体现,所以顾恺之特别重视点睛,曾说“传神写照,正在阿堵中”。

骨骼清奇、眉清目秀、唇若涂朱则是文官相貌的标配。相书中说:“智慧者,眉清目秀,声价少年知。”如小说《武则天四大奇案》《群英杰》中的李白和范仲淹插图,是标准的书生相。图画中的仕女则一般相貌端庄,眉目如画,樱桃小嘴,也符合相书“女子口小兮,聪慧智良”的说法。奸臣和恶人在古代绘画和文学作品中也有可辨认的外貌符号,如小说《绿野仙踪》《铁冠图》《全唐五代史演义》插图中的严世蕃、李自成和黄巢,都是贼眉鼠眼,獐头鹰鼻,瞋目乱纹,相书所谓“鼻如鹰嘴,吃人心髓”,“目如蜂目,恶死孤独”,“鼠目獐头,难登仕路,发硬横纹,为人不忠”。可见都是按照相术观念绘制的。

除暗示人物的性格命运外,外貌特征也是一种政治符号。古代宫廷画师是一种高危职业,搞不好就掉脑袋,明初有好几个为朱元璋画像的画师,因为不合圣意而被处死。朱元璋的庐山真面目到底如何?至今仍是一个谜。他的御容目前留下英俊和丑陋两种类型。据明代陆容《菽园杂记》记载:朱元璋对画工为他画的像都不满意,即便画得很逼真,也不见赏。于是,有个画家在形似之外,添上肃穆的表情,终于称旨,朱元璋命作为标准像传写数幅颁赐诸王。可见画工要懂得揣摩圣意,通过图像传达统治者的意志。清初谈迁在《枣林杂俎》中说:朱元璋喜欢微服私访,担心别人认出他,危及生命安全,所以“所赐诸王侯御容,盖疑像也”。日人板元宇一郎,著有《面相与中国人》一书,自称见过朱元璋和赵匡胤的真实画像,朱元璋长着鹰钩鼻,鼻孔很大,两眉之间的距离很宽。赵匡胤则是小眼睛,塌鼻子。张萱《疑耀》卷一记其伯父从云南摹到一幅朱元璋御容:“龙形凤髯,左脸有十二黑子,其壮甚奇”。这幅画中的朱元璋相貌怪异,长着扭曲的龙嘴,上面布满麻点。其实,这是通过画像暗示他才是真龙天子。

至清代,随着西方传教士陆续来华,清廷肖像画在表现形式中逐渐融合了西方绘画元素,呈现出前所未有的多样性和创作性,真实地再现人物的体态容貌、配饰等客观物象,体现了鲜明的满族文化特色。

古代相术观念是天人合一哲学思想的产物,天圆地方,星光灿烂,草木葱茏,树枝修长,人的形体器官若符合天象则为佳相,反之则凶。这是理解中国肖像画的一把钥匙。