土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ 转自明经二次开发技术

转自明经二次开发技术

发布于:2007-03-06 18:29:06 来自:建筑设计/CAD下载及教程 [复制转发]
在运行LISP程序时要注意把对象捕捉关了(转自明经)
在我们用LISP画图时往往有时已经正确编写了代码,但在运行时却不太符合自己的意愿,有时可能原因就是我们没有把对象捕捉这个功能给关了,我就遇到这样的情况好几次,当我不关对象捕捉时怎么弄都不符合意愿,关了对象捕捉就行了。我觉得我们在写程序时应该养成一种习惯,让程序把对象捕捉关了,要不有时我们的客户(用户)他们也许并不知道这个,所以我们应该在程序前加上关闭对象捕捉
(setq os(getvar "osmode")) (setvar "osmode" 0)
到最后再还原
(setvar "osmode" os)
这样就不会出现程序画出的结果不符合意愿的情况,除非你的程序是错的。

全部回复(10 )

只看楼主 我来说两句
  • huerfei008
    huerfei008 沙发
    2



    4. 接下来使用下列代码就可创建完整的应用程序对象实例:

    Dim ExcelApp as Excel.Application

    ’激活要与之通信的Excel应用程序

    On Error Resume Next

    Set ExcelApp=GetObject( , "Excel.Application")

    If Err<>0 Then

    Set ExcelApp=CreateObject("Excel.Applicationn")

    End If

    注意GetObject和CreateObject函数的区别。当Excel程序已经在运行时,前者可以马上创建Excel应用程序的实例,这样不会出现2个Excel应用程序对象实例,这将有效地节省系统资源的开销。如果当前Excel没有运行,GetObject函数将出错,紧接着Err将捕获错误,并运行CreateObject函数创建一个Excel应用程序实例,所以在具体使用时,这2个函数最好都不要省略。

    三、将明细表做成一个Excel报表

    1、 运行AutoCad2000程序

    2、 打开AutoCad2000主运行文件夹下的“\Sample\Actives\ExtAtt\attrib.dwg”文件。该文件的右上角有一明细表,该明细表的每一行都是一个插入的块引用,显示的文字就是块的属性文本或标签(主要用于标题)

    3、 创建成下面的过程及代码,并运行之

    SubBlkAttr_Extract()
    DimExcelAsExcel.Application
    DimExcelSheetAsObject
    DimExcelWorkbookAsObject
    ’创建Excel应用程序实例
    onErrorResumeNext
    SetExcel = GetObject(, "Excel.Application")
    IfErr <> 0Then
    SetExcel = CreateObject("Excel.Application")
    EndIf
    ’创建一个新工作簿
    SetExcelWorkbook = Excel.Workbooks.Add
    ’确保Sheet1工作表为当前工作表
    SetExcelSheet = Excel.ActiveSheet
    ’将新创建的工作簿保存为Excel文件
    ExcelWorkbook.SaveAs "属性表.xls"
    ’令Excel应用程序可见
    DimRowNumAsInteger
    DimHeaderAsBoolean
    DimblkElemAsAcadEntity
    DimArray1AsVariant
    DimCountAsInteger
    RowNum = 1
    Header = False
    ’遍历模型空间,查找明细表的每个块引用表行
    For bEachblkElemInThisDrawing.ModelSpace
    WithblkElem
    ’当一个块引用表行被找到后,检查它是否有属性
    IfStrComp(.EntityName, "AcDbBlockReference", 1) = 0Then
    ’如果有属性
    If . HasAttributesThen
    ’提取块引用中的属性
    Array1 = .GetAttributes
    ’这一轮循环用来查找标题,如果有填在第1行
    ForCount = LBound(Array1)ToUBound(Array1)
    ’如果还没有标题
    IfHeader = FalseThen
    ’作为标题的明细行其块属性常设为Constant类型
    IfArray1(Count).ConstantThen
    ExcelSheet.Cells(RowNum, Count + 1).Value _
    = Array1(Count).TextString
    EndIf
    EndIf
    NextCount
    ’从第2行开始,填写其它的明细表行内容
    RowNum = RowNum + 1
    ForCount = LBound(Array1)ToUBound(Array1)
    ExcelSheet.Cells(RowNum, Count + 1).Value _
    = Array1(Count).TextString
    NextCount
    Header = True
    EndIf
    EndIf
    EndWith
    NextblkElem
    ’对填入当前表单的内容,按第1列进行排序,
    ’范围是从A1单元格开始的整个工作表
    Excel.Worksheets("Sheet1").Range("A1").Sort _
    key1:=Excel.Worksheets("Sheet1").Columns("A"), _
    Header:=xlGuess
    ’显示Excel工作表中的结果
    Excel.Visible = True
    ’该语句用来等待查看显示结果
    MsgBox "按‘确定’键将关闭Excel的运行!"
    ’保存传过来的数据
    ExcelWorkbook.Save
    ’关闭Excel应用程序
    Excel.Application.Quit
    ’删除Excel应用程序实例
    Set Excel = Nothing
    End Sub
    运行上述代码后,将在“\My Documents”文件夹下生成一“属性表.xls”文件。由于在attrib.dwg文件中,其明细表中第一行标题的文字不是块属性,而是文本对象,所以在“属性表.xls”文件中的第1行为空。不过在Excel界面下要编写一行标题是非常容易的。在多数情况下,作为标题的明细表行是不希望随便改动的,所以标题行地块属性往往被设成固定不变(Constamt)类型。在ActiveX中的Attribute和AttributeRef对象,都有一个Constsnt属性,用来判断某个块或块引用中的属性值类型,它是一个布尔类型的值,其值若为True,表示块属性值为Constsnt类型。
    本代码在Windows95\AutoCadR2000上运行通过。



    2007-03-06 18:53:06

    回复 举报
    赞同0
  • huerfei008
    huerfei008 板凳
    AutoCad与Excel的连接及明细表的输出

    一、 Excel 的ActiveX对象模型:
    1. WorkBooks集合对象

    一个WorkBook对象实际上就是一个Excel文件,Excel应用程序可以同时打开或创建多个文件,它们被保存在WorkBooks集合对象中,可以通过索引号或名称访问集合中的任何一个工作簿,如下语句所示:

    ’该语句激活WorkBooks集合中的第一个工作簿,使其成为当前工作簿

    WorkBooks(1).Activate

    ’该语句激活WorkBooks集合中的Mybook.xls工作簿,使其成为当前工作簿

    WorkBooks("Mybook.xls"). Activate

    2.Worksheets对象

    每个工作簿对象上可以有多个工作表WorkSheet。在默认情况下, Excel的当前工作簿上有名为Sheet1,Sheet2,Sheet3三个工作表,并且Sheet1为当前工作表。如果想使Sheet2成为当前工作表,则可使用下列语句:

    ExcelApp.Worksheets("Sheet2").Activate

    3.Range对象

    该对象用来指定工作表上的区域。将单元格A1的值赋给单元格A5的语句说明如下:

    Worksheets("sheet1").range("A5").value=worksheets("sheet1").range("A1").value]

    上述语句将Sheet1工作表上的A1(第1行第1列)单元格中的值,赋给Sheet1工作表上的A5(第5行第1列)单元格。

    再看下面的语句:

    ‘将单元格A1和D26构成的区域选中

    worksheets("sheet1").range("a1:d26").select

    这条语句中的Select方法所产生的效果,与我们平时用鼠标在屏幕上将A1:D26区域上的单元格进行刷黑选择是一样的。Rnge对象的另一个重要方法是Sort,该方法用来对工作表上选定的区域进行排序,它带有许多参数,下面我们看一下该方法的语法格式:

    Expression.sort(Key1,Order1,Key2,Type,Order2,Key3,Order3,Header,OrderCustom,_

    MatchCase,Orientation,SortMethod,IgnoreControlCharacters,IgnoreDiacritics,IgnoreKashide)

    其中:

    expression:必选参数。该表达式返回Rang对象选定的区域。

    Key1:Variant类型,可选参数。第一个排序字段,主要是Rang对象返回的区域或由工作表对象的Columns属性指定的列。

    Order1:Variant类型,可选参数。可为下例xlSortOrder内置常量之一, xlAscending或xlDescending。用xlAscending表示以升序排列Key1。用xlDescending表示以降序排列Key1。默认值为升序xlAscending。

    Key2:Variant类型,可选参数。第二个排序字段,主要是Rang对象返回的区域或由工作表对象Columns的属性指定的列。如果省略本参数,则没有第二个排序字段。对数据透视表排序时不用。

    Type:Varoant类型,可选参数。指定参与排序的要素。可为下列xlSortType常量之一:xlSortValues或xlSortLabels。仅用于对数据透视表的排序。

    Order2:Variant类型。可选参数。可为下列XlSortOrder常量之一:xlDescending或xlDescending。用xlAscending表示以升序排列Key2。用xldescending表示以降序排列Key2。默认值为xlAscending。对数据透视表排序时不用。

    Key3:Variant类型,可选参数。第三个排序字段,主要是Rang对象返回的区域或由工作表对象的Columns属性指定的列。如果省略本参数,则没有第三个排序字段。对数据透视表排序时不用。

    Order3:Variant类型,可选参数。可为下列xlSortOrder常量之一:xlAscending或xlDescending。用xlAscending表示以升序排列Key3,用xlDescending表示以降序排列Key3。默认值为xlAscending。对数据透视有排序时不用。

    Heard:Variant类型,可选取参数。指定第一行时否包含标题。可为下列xlYesNoGuess常量之一:xlYes、xlNo或xlGuess。如果首行包含标题(不对首行排序),就指定xlYes。如果首行不包含标题(对整个区域排序),就指定xlNo。若指定为xlGuess,将由Microsoft Excel判断是否有标题及标题位于何处。默认值为xlNo。对数据透视表排序时不用。

    OrderCustom:Variant类型,可选参数。以从1开始的整数指定在自定义排序顺序列表中的索引号。如果省略本参数,就使用不着1(“常规:“)。

    MatchCase:Variant类型,可选。若指定为True,则进行区分大小写的排序;若指定为False,则排序时不区分大小写。对数据透视表排序时不用。

    Orientation:Variant类型,可选参数。如果指定为xlTopToBottom,排序将从上到下(按行)进行。如果指定为xlLeftToRight,排序将从左到右(按列)进行。

    SortMethod:Variant类型,可选参数。排序方式。可为下列xlSortMethod常量之一:xlSyllabary(按发音排序)或xlCodePage(按代码页排序)。默认值为xlSyllabary。

    IgnoreControlCharacters:Variant类型,可选参数。不用于美国英语版的Microsoft Excel中。

    IgnoreDiacritics:Variant类型,可选参数,不用于美国英语版的Microsoft Excel中。

    IgnoreKashida:Variant类型,可选参数。不用于美国英语版的Microsoft Excel中。

    下面语句是有关使用Sort方法的2个示例。

    示例1:对工作表“Sheet1”上的单元格区域A1:C20进行排序,用单元格A1作为第一关键字,用单元格B1作为第二关键盘字。排序是按行以升序(默认)进行的,没有标题。

    Worksheets("sheet1").range(A1:c20").sort,key1:=worksheets("sheet1").range("A1"),key2:=_

    Worksheets("sheet1").range("B1")

    示例2、对工作表“Sheet1“上包含单元格“A1”的当前区进行排序,按第一列中的数据进行排序,并且自动判断是否存在标题行。Sort方法将自动判断当前区。

    Worksheets("Sheet1").Range("A1").Sort,Key1:=Workssheets("Sheet1").Columns("A"),_

    Header:=xlGuess

    4.Cells属性

    工作表对象中的Cells属性,在单元格的选择方面可以达到与Rang相同的效果它是以行Row和列Gol作为参数的,如下语句所示:

    ‘将单元格A1的值赋给单元格A5

    Worksheets("Sheet1").Cells(5,1).Value=Worksheets("Sheet1").Cells(1,1).Value

    上面语句即将第1行第1列(A1)单元格内的值,赋给第5行第1列(A5)单元格。Cells属性的优点是,对于行和列的选择可以采用变量,如下语句所示:

    Worksheets("Sheet1").Activate

    For theYear=1 to 5

    Cells(1,theYear+1).Value=1990+theYear

    Next theYear

    上述语句将在当前工作表的第一行的第2、3、4、5、6列,分别添上1992、1993、1994、1995和1996的值。注意,由于第1条语句已将Sheet1设为当前工作簿,所以Cells属性可以不必显示指定工作表。

    5.GetObject和CreateObject函数

    二、在AutoCad创建Excel应用程序

    1. 打开AutoCad的VBA编辑器

    2. 选择“工具”\“引用”项,在弹出的“引用”对话框的“可使用的引用”列表框内,选择“Microsoft Excel 8.0 Object Library"项

    3. 单击“确定”按钮

    2007-03-06 18:52:06

    回复 举报
    赞同0
加载更多
这个家伙什么也没有留下。。。

CAD下载及教程

返回版块

52.08 万条内容 · 666 人订阅

猜你喜欢

阅读下一篇

换完主板后,电脑用一小时左右就无显示?

联想电脑换完主板后,还原系统,电脑使用一小时左右就显示器就无显示,主机电源灯亮,电源工作,复位键没反应,关闭电源后,起不来。歇一会儿就能起来。使用一小左右后,问题又一样了。 请教高手,是什么问题?

回帖成功

经验值 +10