黄玉宏 发表于 2006-5-31 10:08:00

[求助]启动CAD时自动添加日期关闭时自动删除

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">各位高手和斑主:你们好!</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">有一个问题想请教各位,我做了一个图纸模板,想自动添加当前日期。现在自动添加日期已解决了,可出现了每次打开时均添加一次日期的情况,这样就在同一地方有多个日期的情况。不知怎样在关闭<FONT face="Times New Roman">CAD</FONT>文档时自动删除添加的日期<FONT face="Times New Roman">(</FONT>还有别的其它有用的单行文字,不能删除<FONT face="Times New Roman">)</FONT>。以下是我写的自动添加代码,请各位帮助解决关闭时自动删除日期<FONT face="Times New Roman">(</FONT>单行文字<FONT face="Times New Roman">)</FONT>的问题,拜托了!</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Private Sub AcadDocument_Activate() &nbsp;'自动添加日期(单行文字)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Dim TextObj As AcadText</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Dim TextString As String</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Dim InsPnt(0 To 2) As Double</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Dim Height As Double</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Set FontStyle = ThisDrawing.TextStyles.Add("宋体长型0.67")</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>FontStyle.SetFont "宋体", False, False, 0, 0</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>If Not Err Then ThisDrawing.ActiveTextStyle = FontStyle</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>FontStyle.Height = 6</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>FontStyle.Width = 0.4</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>ThisDrawing.ActiveTextStyle = FontStyle</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>InsPnt(0) = 259: InsPnt(1) = 1.8: InsPnt(2) = 0</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Height = 6.5</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">TextString = Format(ConvertJulianDate(ThisDrawing.GetVariable("DATE")), "YYYY.MM.DD")</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Set TextObj = ThisDrawing.ModelSpace.AddText(TextString, InsPnt, Height)</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>End Sub</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>Public Function ConvertJulianDate(julianDate As Double) As Date&nbsp;&nbsp;&nbsp; '加载在模块中</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>ConvertJulianDate = julianDate - 2415019</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体>End Function</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face=宋体>&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">黄玉宏  <FONT face=宋体>2006.5.31</FONT></P>

xinghesnak 发表于 2006-5-31 16:57:00

<P>给你提一个思路(没有验证过);可以把生成的文字的句柄存在系统变量里,然后在关闭事件里删除句柄对应的对象。。。。你试一试行不行,不行的话你再回个帖子吧!</P>

黄玉宏 发表于 2006-5-31 18:26:00

<P>谢谢2楼的回复,可是我没有你所说的那种水平,我是5.3日才开始学CADVBA的,当初学习是为了编制一个多段线绘制公路横断面程序,现在程序已结束了,但水平提高不快。不知各位能否帮忙实现我的愿望!再次谢谢!</P>
<P>黄玉宏 二○○六年五月三十一日</P>

xinghesnak 发表于 2006-6-1 11:38:00

<P>Private Sub AcadDocument_Activate()&nbsp; </P>
<P>Dim TextObj As AcadText</P>
<P>Dim TextString As String</P>
<P>Dim InsPnt(0 To 2) As Double</P>
<P>Dim Height As Double</P>
<P>Set FontStyle = ThisDrawing.TextStyles.Add("&Euml;&Icirc;&Igrave;&aring;&sup3;¤&ETH;&Iacute;0.67")</P>
<P>FontStyle.SetFont "&Euml;&Icirc;&Igrave;&aring;", False, False, 0, 0</P>
<P>If Not Err Then ThisDrawing.ActiveTextStyle = FontStyle</P>
<P>FontStyle.Height = 6</P>
<P>FontStyle.Width = 0.4</P>
<P>ThisDrawing.ActiveTextStyle = FontStyle</P>
<P>InsPnt(0) = 259: InsPnt(1) = 1.8: InsPnt(2) = 0</P>
<P>Height = 6.5</P>
<P>TextString = Format(ConvertJulianDate(ThisDrawing.GetVariable("DATE")), "YYYY.MM.DD")</P>
<P>&nbsp;</P>
<P>Set TextObj = ThisDrawing.ModelSpace.AddText(TextString, InsPnt, Height)</P>
<P>ThisDrawing.SetVariable "USERS2", TextObj.Handle </P>
<P>End Sub</P>
<P>Public Function ConvertJulianDate(julianDate As Double) As Date&nbsp;&nbsp;&nbsp; </P>
<P>ConvertJulianDate = julianDate - 2415019</P>
<P><BR>End Function</P>
<P>Private Sub AcadDocument_BeginSave(ByVal FileName As String) </P>
<P><BR>On Error Resume Next<BR>ThisDrawing.HandleToObject(ThisDrawing.GetVariable("USERS2")).Delete<BR>On Error GoTo 0<BR>End Sub</P>
<P>这里没有提重复文字的问题,我现在也没有确切的方法判断原来的那个位置是否存在你创建过的时间文字。要是通过插入点+块类型判断可能也不准确。这个方面你自己想想吧!</P>

xinghesnak 发表于 2006-6-1 11:38:00

呵呵!不知道字体怎么显示不出来。。。。

黄玉宏 发表于 2006-6-1 15:43:00

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">感谢<A name=16416><FONT color=#000066><B>xinghesnak</B></FONT></A>回复,字体问题我在CAD2006版上未发现。这个问题我自己也刚刚用选择集解决,现拿出来与大家一起讨论。</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Private Sub AcadDocument_Activate()</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim TextObj As AcadText</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim TextString As String</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim InsPnt(0 To 2) As Double</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim Height As Double</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Set FontStyle = ThisDrawing.TextStyles.Add("</FONT>宋体长型<FONT face="Times New Roman">0.67")</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">FontStyle.SetFont "</FONT>宋体<FONT face="Times New Roman">", False, False, 0, 0</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">If Not Err Then ThisDrawing.ActiveTextStyle = FontStyle</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">FontStyle.Height = 6</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">FontStyle.Width = 0.4</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">ThisDrawing.ActiveTextStyle = FontStyle</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">InsPnt(0) = 259: InsPnt(1) = 1.8: InsPnt(2) = 0</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Height = 6.5</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">s = Format(ConvertJulianDate(ThisDrawing.GetVariable("DATE")), "YYYY.MM.DD")</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">TextString = s</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Set TextObj = ThisDrawing.ModelSpace.AddText(TextString, InsPnt, Height)</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">End Sub</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Private Sub AcadDocument_Deactivate()</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim SSetObj As AcadSelectionSet</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Set SSetObj = ThisDrawing.SelectionSets.Add("DelDateText")</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">'</FONT>创建过滤器<FONT face="Times New Roman">Text(</FONT>单行文本<FONT face="Times New Roman">)</FONT>、<FONT face="Times New Roman">Mtext(</FONT>多行文本<FONT face="Times New Roman">)</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim fType(0) As Integer</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim fData(0) As Variant</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">fType(0) = 0</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">fData(0) = "Text,Mtext"</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">'</FONT>选择全部的<FONT face="Times New Roman">Text</FONT>、<FONT face="Times New Roman">Mtext</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">SSetObj.Select acSelectionSetAll, , , fType, fData</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">If SSetObj.Count &lt;&gt; 0 Then</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Dim i As Integer</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">For i = 0 To SSetObj.Count - 1</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">'Text</FONT>和<FONT face="Times New Roman">Mtext</FONT>中显示的是<FONT face="Times New Roman">TextString</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">If SSetObj(i).TextString =<B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red"> s</B> Then SSetObj(i).Delete</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Next</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">End If</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">SSetObj.Delete</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Set SSetObj = Nothing</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">End Sub</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">'</FONT>以下加载在模块内:</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Public s As String<SPAN style="mso-spacerun: yes">&nbsp; '</SPAN></FONT>申明<FONT face="Times New Roman">S(</FONT>存放当前日期<FONT face="Times New Roman">)</FONT>全局字符变量,这点很重要。两过程共用此变量!</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">Public Function ConvertJulianDate(julianDate As Double) As Date</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">ConvertJulianDate = julianDate - 2415019</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman">End Function</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">感谢明经通道!感谢晓东<FONT face="Times New Roman">CAD</FONT>! 黄玉宏 <FONT face="Times New Roman">2006.6.1</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><FONT face="Times New Roman">&nbsp;</FONT></o:p></P>

xinghesnak 发表于 2006-6-2 08:42:00

<P>说一下你的程序中的三个问题:</P>
<P>1,你在程序中用的是AcadDocument的Activate和<FONT face="Times New Roman">Deactivate时间,这两个事件表示激活或者不激活当前图形。而不是你要的打开图形,或者关闭图形。建议用BeforeClose事件。</FONT></P>
<P><FONT face="Times New Roman">2。你用过滤器的时候,只检测到含有日期的文字,假如你的图形中还含有同样的的日期文字,那就一并删了。会不会造成你的程序将来有问题?建议再增加检测条件,来减小误删除的可能性。</FONT></P>
<P><FONT face="Times New Roman">3。在Activate事件中无条件的添加日期文字,会造成大量的文字迭放在一起。所以建议在Addtext之前先检测指定位置有没有日期文字再进行添加</FONT></P>
<P><FONT face="Times New Roman">以上只是我个人的看法,可能你的程序有自己适用的环境,仅供参考吧!</FONT></P>

黄玉宏 发表于 2006-6-2 13:45:00

<P>谢谢<A name=16571><FONT color=#000066><B>xinghesnak</B></FONT></A>,诚如你所言,我的程序有特定的使用环境。关于 Activate和<FONT face="Times New Roman">Deactivate事件,我是先做VB后做ExcelVBA再做CADVBA的,这两个事件确实应如此用。打开CAD必然激发Activate事件(在Excel中修改系统本身一般放在此事件中),关闭CAD也必然激发Deactivate事件(恢复对Excel系统的修改放在此事件中,而千万不能放在BeforeClose事件中,因关闭中途还可再次使用取消命令)。我对CAD的编程绝大多数是在Excel中,因其有强大的数据查询、复制、筛选等功能,一般可只是交CAD看作是其一个高级绘图控件。向你学习主,衷心感谢你助人为乐的精神!</FONT></P>
<P><FONT face="Times New Roman">黄玉宏  二○○六年六月二日</FONT></P>

luojie110 发表于 2017-12-20 17:25:54

VBA的编程很

dong20030432 发表于 2018-5-3 12:05:58

使用扩展数据给日期对象添加特殊标记,就能避免误删除问题,检测不到时就创建新对象即可。
页: [1]
查看完整版本: [求助]启动CAD时自动添加日期关闭时自动删除