当前位置:文档之家› sw二次开发文档

sw二次开发文档

sw二次开发文档
sw二次开发文档

VBA(Visual Basic for Application)实际就是集成在应用程序内部的开发语言,可以看作是VB的简化版本。使用VBA 编写的程序即称为“宏”。注意,VBA编写的宏是不能脱离应用程序而独立运行的,例如SW的宏必须在SW环境下运行。在SW中打开VBA的方法:使用菜单【工具/宏操作/新建...】或者【工具/宏操作/编辑】

第一课简单的VB知识

VB是我们使用的开发工具,多了解VB知识有助于我们更好的进行SW的二次开发。如有可能,请尽可能抽出时间认真学习VB。VB是面向对象的开发工具。所以“对象”是我们所需要操作的核心。对象代表应用程序中的元素,例如草图直线、拉伸特征。如果我们需要在SW中画一条直线,实际就是添加一个草图直线对象。如果需要修改拉伸特征的定义实际就是编辑拉伸特征对象。

每个对象都有自己的“属性”和“方法”。

“属性”描述了对象的特性,例如Layer(图层)对象有这样几个属性:Name(名称),Color(颜色),Widty(线宽)。显然,只要我们将这几个属性一一表述清楚就可以准确的描述出这个图层对象的特性。

“方法”就是对象所能进行的操作。例如PartDoc(零件文档)对象有这个方法:SaveToFile2。只要我们获得了PartDoc 对象,就可以使用这个方法将当前选择的曲面或实体保存为文件。

提示:对于简单的VB知识,可以查看VBA的帮助。(打开VBA的编程界面,然后使用菜单【帮助/VB 帮助】,或者直接按 F1 键)

第二课 SW的对象模型

我们可以SW的API帮助查询SW相关的对象、属性和方法。

打开SW,使用菜单【帮助/SW API和插件帮助主题】,在弹出的帮助窗口中选择【索引】标签,并输入关键字“object”,然后双击想要查看的主题(object diagram, SolidWorks API)。如需要进一步查询某个对象的具体信息,可以点击图片中对应的对象明。

例如,我们单击“SldWorks”,(如果你很熟悉对象名,可以直接在索引中输入对象名,这样查询对象的属性和方法更便捷) 。

第三课开始简单的编程

如何使用SW提供的这些对象进行我们的二次开发,我们来看看下面这个简单的例子。

我们可以看到SW众多的对象中,SolidWorks对象(SW应用程序对象)处于最顶层,所以获得SldWorks对象是首先要做的Set swApp = Application.SldWorks

上面这条语句的作用是将swApp变量设置成为SW应用程序对象,获得应用程序对象之后,我们就可以使用他的方法来完成我没需要的功能。例如,现在我们需要知道当前SW所使用的语言。

Lang = swApp.GetCurrentLanguage()

使用swApp对象的GetCurrentlanguage方法,并将返回值赋予变量Lang。完整的程序是这样:

ASP/Visual Basic代码

1. Sub main()

2. Set swApp = Application.SldWorks

3. Lang = swApp.GetCurrentLanguage()

4. MsgBox Lang '弹出消息框,显示当前SW使用的语言

5. End Sub

具体的操作方法是这样:

?打开SW;

?使用菜单【工具/宏操作/新建...】;

?输入文件名,并保存;

?显示VBA的工作界面;

?删除窗口中自动生成的程序代码,然后将上面的程序复制到窗口中(中括号内的部分,不包括中括号;

?使用工具栏上的保存按钮,保存结果;

?使用菜单【运行/运行子过程】,或者单击工具栏上的运行按钮(蓝色箭头);

?显示运行结果。

第四课关于变量的声明

一般在变量使用前,都要首先声明变量,下面来看看声明对象变量的方法:

Dim swApp As Objict

swApp As SldWorks.SldWorks

上面两段语句的作用都是声明了对象变量“swApp”。前一段语句将变量声明为一般的对象类型,后一段语句将变量声明为指定的对象类型(此例中声明为Solidworks应用程序对象)。

声明指定的对象类型提供自动的类型检查,更快的代码,并增加可读性。建议尽量使用这种声明的方法。如果有的对象只有在程序执行时才能确定起变量的类型,在编程时不能确定其确切的类型,那么就可以将其声明为一般的对象类型。

下面列举几个SW种常用对象的声明:

Dim swApp As SldWorks.SldWorks 'SW应用程序对象

Dim swModel As SldWorks.ModelDoc2 '文档对象

Dim swPart As SldWorks.PartDoc '零件文档对象

Dim swAssembly As SldWorks.AssemblyDoc '装配体文档对象

Dim swDrawing As SldWorks.DrawingDoc '工程图文档对象

Dim swFeature As SldWorks.Feature '特征对象

Dim swSelectMgr As SldWorks.SelectionMgr '选择管理器对象

第五课在开发环境中添加类型库的引用

先看看添加引用的方法:通过菜单【工具/引用...】,在对话框中选择下面两项 (根据SW的不同,名称可能略有不同)。SldWorks 2006 Type Library

SolidWorks 2006 Constant Type Library

前一项定义了SW中的所有对象。如果在你的程序中需要操作SW的对象,就不要忘记选中它。在默认的环境中已经选择了这项。(如果你需要在程序中操作Excel对象,例如读取表格数据,那么不要忘了选中Execl对象库的应用)。后一项定义了二次开发中会用到的SW中所有的常量,默认环境中没有选择,需要自己添加引用。让我们举个例子看看它用什么作用。

下面是一个典型的创建新文档的语句

set newDoc = SldWorks.NewDocument ( ***, swDwgPaperA3size, ***, *** )

set newDoc = SldWorks.NewDocument ( ***, 8, ***, *** )

两句语句作用是相同的,但是前一句的可读性更好,我们可以很直观的看到创建了一个A3大小的文档。如果没有添加对SW常量的引用,那么,前一种写法将导致程序运行出错。

第六课赋值和引用 (Let & Set)

对于变量的赋值,我们使用Let语句,如:Let a = 10

我们也可以省略Let,如上句也可写成:a = 10

对于对象的引用,我们使用Set语句,如:Set obj1 = ***;注意,Set不能省略。赋值和引用是有区别的,如:

a = 10

b = a

上例中出现了两个变量,这两个变量是独立的,虽然此时他们的值都是10,但是,如果修改其中一个变量的值并不会影响另一个变量。

Set obj1 = ***https://www.doczj.com/doc/ba13350564.html,"q [m R ` ? A2B

Set obj2 = obj1

上例中也出现了两个变量,但他们引用了同一个对象,无论如何修改对象,都会同时反映到两个变量。其实,引用只是建立了一个访问对象的路径,即使上例中两个变量都被释放,对象依然存在,只是暂时不能被访问而已。

第七课录制宏——快速写代码的方法

所谓录制宏,就是记录人的操作过程,并将其转换成程序代码。

注意,并不是所有的操作都能被转换成代码的,而且,自动录制的程序对环境的要求比较严谨,导致录制的程序兼容性很差。所以,在真正的开发中,录制宏只能担当辅助的角色。但是录制宏易学易用,值得初学者学习。以下是录制的过程,以及得到的程序。

第八课修改特征定义

手动修改特征定义是我们经常作的事,当然,也可以使用程序自动完成。(修改特征定义的操作是不能用录制宏功能记录的),让我们利用上边录制的程序来练练如何修改特征定义。

1. 获得特征对象(Feature Object)的引用

我们可以很容易的找到程序中添加拉伸特征的语句,但是他没有建立引用。自己手动改一下;

原来:Part.FeatureManager.FeatureExtrusion True, False, False, 0, ...

改为:Set featObject = Part.FeatureManager.FeatureExtrusion (True, False, False, 0, ...)

2. 获得特征定义对象(Feature Definition Object)的引用

注意,特征对象中保存的数据主要是特征的名称,特征的显示状态等信息,而特征定义对象中保存的信息才是我们需要的。可以用 "GetDefinition" 方法获得特征定义对象的引用

Set featObjDef = featObject.GetDefinition()

3. 使用对象的属性和方法以获得需要的数据,例如获取拉伸特征第一方向的拉伸深度

a = featObjDef.GetDepth(True)

4. 修改特征定义,设置拉伸深度为原来的两倍

featObjDef.SetDepth True, a * 2

5. 更新特征定义

featObject.ModifyDefinition featObjDef, Part, Nothing

编辑原文件,按以上步骤修改,并且在文档头部添加适当的变量声明,然后看看运行结果。

特别注意,无论你的模型使用的是什么单位制,在二次开发时,一律使用米(m)为长度单位,弧度(rad)为角度单位。

可以尝试一下,修改特征定义中的其他项目。

使用VBA进行solidworks开发指南

专业交流2009-05-07 23:21 阅读69 评论0 字号:大大中中小小作者:marsarden 转载请注明

在对solidworks原有功能进行改善的过程中,有效地利用solidworks提供给我们的应用编程接口(API)来编写提高我

们工作效率的程序是其中手段之一。本文在于总结作者进行此类开发的经验,给大家提供一些经验性建议。

目录

第1章概述 (2)

1.1 内容简介 (2)

1.2 名词解释 (2)

1.3 预备知识 (3)

第2章录制、编辑、运行宏 (3)

2.1 录制、编辑、运行宏基本步骤: (3)

2.2 一些基本的建议: (3)

第3章代码格式及帮助信息 (5)

3.1 代码格式: (5)

3.2 获得帮助: (6)

第4章常用对象模型 (7)

4.1 综述: (7)

4.2 SldWorks.SldWorks : 8

4.3 SldWorks.ModelDoc2: (8)

4.4 SldWorks.PartDoc、SldWorks.AssemblyDoc、SldWorks.DrawingDoc: (9)

4.5 SldWorks.feature、SldWorks.Sketch : (9)

第5章零件 PartDoc. 9

5.1 综述: (9)

5.2 选择对象的话题: (10)

5.3 访问并修改特征: 12

5.4 草图的话题: (17)

第6章装配体 (18)

6.1 综述: (18)

6.2 组件的话题:插入零部件到装配体 (19)

6.3 配合的话题:在装配体中添加配合 (22)

6.4 由于说到参考,顺便讨论一下配合参考: (26)

第7章工程图 (28)

7.1 综述: (28)

7.2 注释的话题: (29)

7.3 生成图纸的话题:并讨论如何解决实际问题 (30)

第8章总结: (40)

第1章 arden says:像这样的 Part.ActiveView().RotateAboutCenter 0.0662574, 0.0346621 无情的删掉吧

3、Delete all ModelDocExtension::SelectByID2 calls appearing immediately before ModelDoc2::ClearSelection2 calls. However, do not delete ModelDocExtension::SelectByID2 calls appearing immediately after ModelDoc2::ClearSelection2 calls. Delete all ModelDoc2::ClearSelection2 calls appearing immediately before ModelDocExtension::SelectByID2.

删除所有紧挨ModelDoc2::ClearSelection2之前的ModelDocExtension::SelectByID2调用,不要删除紧挨ModelDoc2::ClearSelection2调用后的ModelDocExtension::SelectByID2。删除所有紧挨ModelDocExtension::SelectByID2之前的ModelDoc2::ClearSelection2。

下图为VBA的集成编辑环境:

编辑完成后,按照程序的要求来运行宏,在VBA编辑器中点“运行”开始执行程序,需要注意,有些宏程序的运

行有前提条件,比如需要事先选择好一个特征等。第一次运行不一定成功,这时候就要对宏代码进行调整,反复一个编

辑代码、测试运行的循环,最后得到比较满意的结果。

加载宏到solidworks有很多种方法我们只介绍最简单的三种:快捷键、菜单、工具栏按钮。可以参考文档《SW技术文

档-2005041402-加载宏到solidworks的三种方法.doc》

swDocumentTypes_e 文档类型

Input:

(long) Options

Mode in which to open the document as defined in swOpenDocOptions_e 打开选项

Input:

输入

(BSTR) Configuration

Model configuration in which to open this document 配置设置

Applies to parts and assemblies, not drawings 只在零件和装配体适用

If this argument is empty or the specified configuration is not present in the model, the model is opened in the last-used configuration. 如果未指定任何配置将使用最后一次打开的配置。

Output:输出

(long) Errors

Load errors as defined in swFileLoadError_e 打开错误

Output:

(long) Warnings

Warnings or extra information generated during the open operation as defined in swFileLoadWarning_e 打开警告

Return:返回

(LPDISPATCH) retval

Pointer to a Dispatch object, the newly loaded ModelDoc2, or NULL if failed to open

Remarks备注:

When opening a parent document (assembly, drawing, and so on):

SolidWorks also opens any additional documents that are referenced in the parent document (parts, subassemblies, and so on).

SolidWorks follows certain rules in trying to locate its referenced documents. If explicit Search Folders have not been set using Tools, Options, System Options, ExternalReferences, then the first place SolidWorks looks for the referenced documents is in the current working directory. If SolidWorks finds the referenced file in the current working directory, then it is loaded from that directory. ……

我们应该具备的素质就是,可以按照上面的参考内容明白API的使用方法和规则。而我们常常需要注意的焦点是语法(Syntax)知道需要输入什么参数返回什么对象就基本OK了,不要被前面一片英文所迷惑。

最后我们介绍一下API帮助的目录:

Solidworks 2005 API Release Notes :此文档树下为sw2005版本的新特性:新对象新函数等

Programmer’s Guide :此文档树目录下为sw编程向导,提供了开始编程的向导、sw对象模型总揽和实际编程中的注意事项等内容。

Examples :此文档树目录下为sw所有示例工程,分为c++和VB两中语言大类。我们经常需要访问的地方。

APIs :sw提供的所有API定义及参考。

Obsolete APIs :sw已过时的API。

swSelectType_e中定义)并且函数并不返回所选择对象而是一个执行状态。如果想得到我们刚才选择的对象,则需要用到另一个函数GetSelectedObject5。

使用GetSelectedObject5之前需要介绍一下SelectionMgr对象:此对象允许你得到所选择对象的信息,对其进行一些操作。GetSelectedObject5就是SelectionMgr对象的一个方法。可以使用ModelDoc2.SelectionManager来得到一个SelectionMgr对象。并且需要注意的是sw将所选择的对象进行了索引,我们可能同时选中了多个对象,通过GetSelectedObject5(index)中得index值来得到不同的选择对象。

看下面程序,它使用SelectByID2将当前打开的模型文件中的特征“拉伸1”选中,如果选择成功的话再使用GetSelectedObject5得到此特征:

‘++++++++++++++++++++++++++++++++

‘Filename Selefeat.swp : Select feature”拉伸1”

‘++++++++++++++++++++++++++++++++

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim Model As ModelDoc2

Dim feature As feature ‘定义一个特征对象

Dim boolstatus As Variant ‘定义api返回值

Sub main()

Set swApp = Application.SldWorks

Set Model = swApp.ActiveDoc ‘前面已经介绍,上面两句话基本上是固定模式

' 选择叫"拉伸1"的特征

boolstatus = Model.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, swSelectOptionDefault)

'主要就是这一句话,在写Option Explicit后函数的最后一个参数swSelectOptionDefault可以使用0来代替

If boolstatus = True Then '如果有“拉伸1”这个特征下面的代码将其选中

Dim SelMgr As SelectionMgr ‘声明一个selectionmgr 对象

Set SelMgr = Model.SelectionManager ‘得到当前模型的选择对象

Set feature = SelMgr.GetSelectedObject5(1) '此处使用一个索引来得到特征

Debug.Print https://www.doczj.com/doc/ba13350564.html, ‘在立即窗口打印特征的name属性

Else

Debug.Print "Error"

End If

End Sub

两个函数的VB语法表述如下,具体请参考API帮助:

ModelDocExtension::SelectByID2

Syntax (OLE Automation)

retval = ModelDocExtension.SelectByID2 ( Name, Type, X, Y, Z, Append, Mark, Callout. SelectOption ) SelectionMgr::GetSelectedObject5

Syntax (OLE Automation)

retval = SelectionMgr.GetSelectedObject5 ( AtIndex )

在选择对象这个话题中我们还要讨论几个API:

ModelDoc2::ClearSelection2 此API清空SW的选择列表,即取消所有选择。

还有activate系列:

retval = SldWorks.ActivateDoc2 ( name, silent, &errors ) ‘激活文档

retval = DrawingDoc.ActivateSheet( SheetName ) ‘激活工程图纸

retval = DrawingDoc.ActivateView ( viewName) ‘激活视图

void ModelDoc2.ActivateSelectedFeature () ‘激活选中特征

选择的话题就到这里结束。

上面有一处关于swSelectOptionDefault的注释大家可能会有疑惑,这里附加上对solidworks API中定义Enum 的介绍。为了让API的参数更直观,swAPI中有很多类似的enum定义,它将一系列小整数和字符串描述符对应,在api 的语法参考中都描述了相应的代表对象。具体实现细节需要参考VB的语法,这里我们需要明白,如果你在程序前面定义了Option Explicit(强制声明)选项,那你需要在使用这些enum时候定义它或使用不直观的整数作为参数。

Public enum swDocumentTypes_e ‘这是一个sw文档类型的列举项

swDocNONE=0 ‘什么也不是

swDocPART=1 ‘零件类型在做为参数时使用1和使用swDocPART效果是相同的,只是swDocPART 意义更加明显

swDocASSEMBLY=2 ‘装配体类型

swDocDRAWING=3 ‘工程图类型

End Enum

arden" '在solidworks中可以使用swAPP.sendmsgtouser2 替代msgbox

featdata.ReleaseSelectionAccess ‘取消特征数据访问

Model.Save

Model.EditRebuild ‘重建模型

End Sub

上面程序运行前,假设你选择了一个简单直孔特征。然后得到这个孔的一些参数:孔深、直径。最初做上面程序的时候,我想象中用Set curfeature = SelMgr.GetSelectedObject5(1) 选中特征以后就可以直接curfeature. Depth了。在参考了API帮助后,我才了解到特征的数据需要先AccessSelections后才能访问。总结一下,要访问一个特征,需要经历这样的步骤:

定义一个特征对象及特征数据对象: dim....as ...

选中这个特征:比如使用GetSelectedObject5 还有SelectebyID等...

得到特征的定义:GetDefinition

进行访问:AccessSelections

上面的程序没有if选择的容错机制,实际编码中,每个可能出现错误的地方都应该使用if来控制,如下面这句话

boolstatus =featdata.AccessSelections(Model, component)。我们就需要通过boolstatus的值来判断上面这个语句运行的是否正确,这里的boolstatus很明显是一个布尔型变量:

If not boolstatus then

‘上面语句运行不成功,写错误报告或退出代码

Endif

已经可以访问特征的各参数了,现在我们来修改它:

要修改前面的步骤不能少,当我们已经可以读取一些特征时,我们就可以给他设定一些值。当然有时需要调用特定的参数。solidworks是ole和com的,所以要习惯这样。

在修改完特征后需要调用函数modifydefinition()来实现变化。

我们给一个例子,这个例子比前面的都要全面,它有很好的容错引导机制,可以直接拿来成为一个稳定的宏程序。

‘+++++++++++++++++++++++++++++++++

'filename : doubleBE.swp

'date :2005-03-22

' This example doubles the length of the base extrude.这个例子将拉伸凸台的长度增加一倍

'+++++++++++++++++++++++++++++++++++

Dim swApp As SldWorks.SldWorks

Dim Model As ModelDoc2

Dim Component As Component2

Dim CurFeature As feature

Dim isGood As Boolean

Dim FeatData As Object '先声明为object,后面自动匹配为 ExtrudeFeatureData 对象

Dim Depth As Double

Dim SelMgr As SelectionMgr

Sub doubleBE()

Set swApp = CreateObject("sldWorks.application")

Set Model = swApp.ActiveDoc

'确定model是零件或正配体,不是就退出。在这里swDocPART 和swDocASSEMBLY如果不能通过编译则参考

’上面的enum介绍,换为1和2

If Model.GetType <> swDocPART And Model.GetType <> swDocASSEMBLY Then

Msg = "Only Allowed on Parts or Assemblies" ' Define message

Style = vbOKOnly ' OK Button only

Title = "Error" ' Define title

Call MsgBox(Msg, Style, Title) ' Display error message

Exit Sub ' Exit this program

End If

' 得到 Selection Manager

Set SelMgr = Model.SelectionManager

' 得到所选的第一个对象

Set CurFeature = SelMgr.GetSelectedObject3(1)

If CurFeature Is Nothing Then

' 什么都没有选中

swApp.SendMsgToUser2 "Please select the Base-Extrude", swMbWarning, swMbOk

Exit Sub

End If

' Check the feature's type name

' Make sure it is an extrusion

If Not CurFeature.GetTypeName = swTnExtrusion Then

’在这里使用swTnExtrusion我的环境没有通过,改成了Extrusion才ok,参考BodyFeatures_e的定义

swApp.SendMsgToUser2 "请选择拉伸基体特征", swMbWarning, swMbOk

Exit Sub

End If

' 得到特征数据

Set FeatData = CurFeature.GetDefinition

' Get the access selections for the feature data

' 注意:访问单独零件时参数Component 为 NULL。如果我们在装配体中使用AccessSelections,将访问最高级文档此时我们的component参数需要制定component来得到其他零件。

isGood = FeatData.AccessSelections(Model, Component)

' Inform the user of an error

If Not isGood Then

swApp.SendMsgToUser2 "Unable to obtain access selections", swMbWarning, swMbOk

Exit Sub

End If

' 确认用户选择的是基体拉伸特征

If Not FeatData.IsBaseExtrude Then

swApp.SendMsgToUser2 "Please select the Base-Extrude", swMbWarning, swMbOk

FeatData.ReleaseSelectionAccess

Exit Sub

End If

' 得到深度并增加到2倍

Depth = FeatData.GetDepth(True)

FeatData.SetDepth True, Depth * 2

' 执行修改

isGood = CurFeature.ModifyDefinition(FeatData, Model, Component)

' 改变步成功

If Not isGood Then

swApp.SendMsgToUser2 "无法修改特征数据", swMbWarning, swMbOk

' 取消对数据的访问

FeatData.ReleaseSelectionAccess

End If

End Sub

TIPs:

如果出现特征出现“退回”状态,只能在代码执行到最后调用

Model.Save

Model.Rebuild

这两个函数来自动更新。

上面的程序中使用了新的没有介绍的API,只作了简单注释性介绍,如果不理解读者可以到API帮助中查看它的细节。这里只看其中一个API,它可能会经常使用:

如果我们定义了一个特征对象:

dim curfeature as sldworks.feature

又通过SelectMgr得到了这个特征,然后可以使用feature.GetTypeName来判断是那种:

Select Case curfeature.GetTypeName

Case "Cut" '一个拉伸切除特征

do sth.

Case "HoleWzd" '一个异型孔特征

do sth.

Case Else

End Select

end select

这是语法:

Syntax (OLE Automation)

retval = Feature.GetTypeName ()

它会返回一个 (BSTR) retval Feature type as defined in BodyFeatures_e

其中BodyFeatures_e 内容比较多,在这里都列出来也没什么用,大家可以参考solidworks API帮助。

arden 2005-4-4

‘函数在当前工作目录CurrentWorkingDirectory插入一个名为“零件1.SLDPRT”的零件

‘前提条件为当前工作目录有名字为”零件1.sldprt”的零件

‘它有配置名为“配置1”

‘+++++++++++++++++++++++++++++++++

Dim swApp As SldWorks.SldWorks

Dim Model As ModelDoc2

Dim pth As String

Dim strpath As String

Sub insertPart()

Set swApp = Application.SldWorks

strpath = swApp.GetCurrentWorkingDirectory ‘当前工作路径

Set Model = swApp.ActiveDoc

pth = strpath & "零件1.SLDPRT" ‘得到文件的FULLPATH全名

Model.AddComponent4 pth, "配置1", 0, 0, 0 ‘添加零部件

End Sub

然而,这个程序比不是想象中那么好用。为什么呢??回头看addcomponent4的remark,上面这样写:

The specified file must be loaded in memory. A file is loaded into memory when you load the file in your SolidWorks session (SldWorks::OpenDoc6) or open an assembly that already contains the file.

就是说你想指定的插入的文件必须在调用函数之前已经在内存中加载了。

不习惯,你就不能直接打开多简单,没办法,我还没有找到好的方法,只能按人家的来:

看看下面的函数Opendoc6,它打开一个文档:

Opendoc6:

retval = SldWorks.OpenDoc6 ( filename, type, options, configuration, &Errors, &Warnings )

Input: (BSTR) Filename Document name or full path if not in current directory, including extension

Input: (long) Type Document type as defined in swDocumentTypes_e Input: (long) Options Mode in which to open the document as defined in swOpenDocOptions_e

Input: (BSTR) Configuration Model configuration in which to open this document:Applies to parts and assemblies, not drawings

If this argument is empty or the specified configuration is not present in the model,

the model is opened in the last-used configuration.

Output: (long) Errors Load errors as defined in swFileLoadError_e Output: (long) Warnings Warnings or extra information generated during the open operation as defined in swFileLoadWarning_e

Return: (LPDISPATCH) retval Pointer to a Dispatch object, the newly loaded ModelDoc2, or NULL if failed to open

这个函数参数1就是文档的全名,参数2是要插入的类型描述,其中0123分别表示:

0 swDocNONE:不是sw文件

1 swDocPART:零件

2 swDocASSEMBLY:装配体

3 swDocDRAWING:工程图

如果想使用swDocNONE,需要定义:

Public Enum swDocumentTypes_e

swDocNONE = 0

swDocPART= 1

swDocASSEMBLY = 2

swDocDRAWING=3

End Enum

参数3是打开文档的模式,一般我们就选择swOpenDocOptions_Silent 用0 表示,当然还有只读、只看等选项参数4是打开选项,一般置空

后面是两个OutPut,用来显示错误打开时的提示

函数返回一个指向打开文件的指针。

按照上面的要求我们在向装配体中插入一个零部件时,需要这样步骤:

1、得到装配体

2、使用opendoc6打开需要插入的零件

3、使用addcomponent4插入零件到装配体

我们上面的程序需要这样来修改一下,添加了一个打开文档的函数:

' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' insertpart 03/21/05 by

arden

'插入零件1

'前提条件:在装配体所在文件夹中有零件“零件1”存在,并且零件1有配置“配置1”

' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dim swApp As SldWorks.SldWorks

Dim Model As ModelDoc2

Dim YSBmodel As ModelDoc2

Dim pth As String

Dim strpath As String

Dim nErrors As Long

Dim nWarnings As Long

Sub insertpart()

Set swApp = Application.SldWorks

strpath = swApp.GetCurrentWorkingDirectory

Set Model = swApp.ActiveDoc

pth = strpath & "零件1.SLDPRT"

openYSB (pth) ‘在添加零部件之前,先打开它

Model.AddComponent4 pth, "配置1", 0, 0, 0

End Sub

'这个函数打开零件1

Sub openpart(ByVal pth As String)

Dim path As String

Dim newswapp As SldWorks.SldWorks

Set newswapp = Application.SldWorks

path = pth

Set YSBmodel = newswapp.OpenDoc6(path, 1, swOpenDocOPtions_Silent, "", nErrors, nWarnings) YSBmodel.Visible = False ‘我不想看到零件1

End Sub

swMateType_e

配合类型

Input:

(long) alignFromEnum

Type of alignment as defined in swMateAlign_e

对齐选项

Input:

(VARIANT_BOOL) flip

TRUE to flip the component, FALSE otherwise

是否翻转

Input:

(double) distance

Distance value to use with distance or limit mates

距离

Input:

(double) distAbsUpperLimit

Absolute maximum distance value (see Remarks)

距离限制max

Input:

(double) distAbsLowerLimit

Absolute minimum distance value (see Remarks)

距离限制min

Input:

(double) gearRatioNumerator

Gear ratio numerator value for gear mates

齿轮配合分子值

Input:

(double) gearRatioDenominator

Gear ratio denominator value for gear mates

齿轮配合分母值

Input:

(double) angle

Angle value to use with angle mates

角度

Input:

(double) angleAbsUpperLimit

Absolute maximum angle value

角度限制max

Input:

(double) angleAbsLowerLimit

Absolute minimum angle value

角度限制min

Output:

(long) errorStatus

Success or error as defined by swAddMateError_e

错误报告

Return:

(LPMATE2) pMateObjOut

Pointer to the Mate2 object

返回指向配合的指针

ModelDoc2::ClearSelection2(VARIANT_TRUE) before selecting entities to mate.

ModelDocExtension::SelectByID2 with Mark = 1 to select entities to mate.

ModelDoc2::ClearSelection2(VARIANT_TRUE) after the mate is created.

If mateTypeFromEnum is swMateCAMFOLLOWER, then use a selection mark of 8 for the cam-follower face.

如果配合类型为凸轮,在表面标示8. 注:这个我也不太明白哈哈

If nothing is preselected, then errorStatus is swAddMateError_IncorrectSeletions and pMateObjOut is NULL/Nothing.

如果实现没有限定实体来配合,将会抱错swAddMateError_IncorrectSeletions,函数返回NULL或者Nothing

上面就是API帮助所说的话,下面给出一段示例程序,假设之前我们已经选择了两个半径一样的圆柱面,那么我们来定义一个同心配合:

Set swmatefeat = swassy.AddMate2(1, 0, False, 0, 0, 0, 0, 0, 0, 0, 0, nErrors)

其中的 Dim swassy As SldWorks.AssemblyDoc

Dim swmatefeat As Object

注:在编程中有时候不能实现确定一个对象的类型,我们可以声明一个Object对象,让VB自己去匹配。但这样做是影响了效率代码也不清晰。

要完成一个距离或者角度要麻烦一些,就像上面的remark中说明的:

Set swmatefeat = swassy.AddMate2(5, 1, True, 0.001, 0.001, 0.001, 0, 0, 0, 0, 0, nErrors)

在这里我们需要将min和max都设置成与距离值相等,要不然配合会认为我们设定了高级配合中的限制条件,会报错。并且第三个参数和第二个参数需要按实际情况来确定。

最后我们列出AddMate2的类型,里面的英文我认识的不多,大部分都是查字典和实验得到的所以列出来,你需要的时候不用实验和查字典了:

swMateType_e

‘Specifies values for assembly-mate information.

swMateCOINCIDENT 0 重合

swMateCONCENTRIC 1 同心

swMatePERPENDICULAR 2 垂直

swMatePARALLEL 3 平行

swMateTANGENT 4 相切

swMateDISTANCE 5 距离

swMateANGLE 6 角度

swMateUNKNOWN 7 未知

swMateSYMMETRIC 8 对称

swMateCAMFOLLOWER 9 凸轮

swMateGEAR 10 齿轮

下面的代码选择了零件的两个面,然后为此零件添加一个配合参考,先选择的面为配合参考的第一参考面。并且是同向、重合配合。第二个为反向、重合配合。

需要看Part.FeatureManager.InsertMateReference函数。第一个参数是配合参考的名称,后面三个为一组定义一个参考。第一个为选择的实体entity,然后是配合类型(整数索引),正反向(整数索引)。

Dim swApp As SldWorks.SldWorks

Dim Part As SldWorks.ModelDoc2

Dim selmgr As SldWorks.SelectionMgr

Dim Feature As SldWorks.Feature

Dim facefst As SldWorks.face2

Dim facesed As SldWorks.face2

Dim facefstent As SldWorks.Entity

Dim facesedent As SldWorks.Entity

Dim tempfeat As Object

Sub addcleatmateref()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc

Set selmgr = Part.SelectionManager

Set tempfeat = selmgr.GetSelectedObject5(1)

If tempfeat.GetType = 2 Then

Set facefst = tempfeat

Set facefstent = facefst

Else

MsgBox "请选择平面"

End If

Set tempfeat = selmgr.GetSelectedObject5(2)

If tempfeat.GetType = 2 Then

Set facesed = tempfeat

Set facesedent = facesed

Else

MsgBox "请选择平面"

End If

Set Feature = Part.FeatureManager.InsertMateReference("配合参考1", facefstent, 2, 1, facesedent, 2, 2, Nothing, 0, 0)

End Sub

在实际的代码中,我们经常需要遍历一个装配体,下面是遍历装配体的方法:

下面的例子完全照API帮助中搬来的,它用来显示当前装配体的所有零部件。程序使用了一个简单的递归方法遍历了装配体。

This example shows how to make all assembly components visible.

'---------------------------------------

' Preconditions: An assembly document is open.

' Postconditions: Any hidden assembly components are made visible.

'---------------------------------------

Option Explicit

Public Enum swComponentVisibilityState_e ‘装配体中组件的显示状态:0隐藏 1显示

swComponentHidden = 0

swComponentVisible = 1

End Enum

Sub TraverseComponent _

( _

swComp As https://www.doczj.com/doc/ba13350564.html,ponent2, _

nLevel As Long _

) ‘递归函数

Dim vChildCompArr As Variant

Dim vChildComp As Variant

Dim swChildComp As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim swCompConfig As SldWorks.Configuration ‘组件配置

Dim sPadStr As String

Dim i As Long

For i = 0 To nLevel – 1 ‘这个循环没什么实际作用,打印父子装配体的缩进

sPadStr = sPadStr + " "

Next i

vChildCompArr = swComp.GetChildren ‘得到装配体的子组件 For Each vChildComp In vChildCompArr ‘对于每个子组件

Set swChildComp = vChildComp

Debug.Print sPadStr & https://www.doczj.com/doc/ba13350564.html,2 & " <" & swChildComp.ReferencedConfiguration & ">"

If swComponentHidden = swChildComp.Visible Then ‘如果他的状态是隐藏则给它显示

swChildComp.Visible = swComponentVisible

End If

TraverseComponent swChildComp, nLevel + 1 ‘如果他也有子组件,进入递归 Next

End Sub

Sub main()

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swAssy As SldWorks.AssemblyDoc

Dim swConf As SldWorks.Configuration

Dim swRootComp As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim bRet As Boolean

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc

Set swConf = swModel.GetActiveConfiguration

Set swRootComp = swConf.GetRootComponent

Debug.Print "File = " & swModel.GetPathName

TraverseComponent swRootComp, 1

End Sub

装配体的话题到此为止,回顾一下我们学习了怎样在装配体中插入组件,怎样添加一个配合,怎么样访问装配体中的每一个子组件,内容够丰富了。下面我们来讨论最后一个主题:工程图。

工程图

工程图中包含了两个独立的对象,图纸sheet和视图view。但是对使用者来说很容易将图纸对象架设在视图对象上方。因为给人直观感觉是一个工程图可能有多个sheet,每个sheet中又可以有多个view。

其实从右边的对象模型中可以看到,真正的内容还都在view对象中,而view并不受sheet限制,它们在DrawingDoc中是平行的。

我们主要通过两个话题来讨论工程图:一个是注释的问题,一个是生成图纸。

这里讨论的注释是工程图图纸格式的注释,即工程图中的说明部分的控制。下面的程序读取当前图纸的每一个note,并在debug中打印结果。

Option Explicit

Dim swname As String

Dim swtext As String

Sub main()

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swDraw As SldWorks.DrawingDoc ‘工程图对象

Dim swView As SldWorks.View ‘视图对象

Dim swNote As SldWorks.note ‘注释对象

Dim swAnn As SldWorks.Annotation ‘标注对象

Dim bRet As Boolean

Set swApp = CreateObject("SldWorks.Application")

Set swModel = swApp.ActiveDoc

Set swDraw = swModel

Set swView = swDraw.GetFirstView ‘得到第一个视图

Set swNote = swView.GetFirstNote ‘得到第一个注释

swModel.ClearSelection2 (True)

Debug.Print "File = " & swModel.GetPathName

Do While Not swNote Is Nothing

Set swAnn = swNote.GetAnnotation ‘得到标注

bRet = swAnn.Select2(True, 0) ‘高亮选中

Debug.Assert bRet

swname = swNote.GetName

swtext = swNote.GetText

Debug.Print " 名称:" & swNote.GetName; " *** 文本: " & swNote.GetText

Set swNote = swNote.GetNext ‘下一个注释

Loop

End Sub

上面的程序只是对工程图的所有标注进行了一个遍历,打印出注释的名称和内容。我们能够了解一下drawdoc对象各个子对象的访问方法就可以了。

最后这个话题比较大,顺便我们也将讨论针对一个问题如何规划,何如进行模块化编程的问题。下面代码是工程图助手中的“生成工程图”模块内容。它按照我们的图纸存储规范,把一个产品的每个装配体都生成一个solidworks的工程图文件。

面对一个问题,我们在试图使用VBA来改善工作的时候,可以参考下面的思路来进行,当然,这也只是个人的一些经验之说,并不是最好的工作方式:

首先我们需要了解实际工作情况,发现问题所在:工艺人员在试图提高solidworks工作效率的时候提到了使用SolidWorks Task Scheduler来自动出图纸的方法(具体方法就不讨论了)。大家经过一段时间的使用后发现,使用SolidWorks Task Scheduler有一定的局限性,需要问题在于,它将每个solidworks文件—包括零件、装配体—都生成了一个工程图文件。然而这样得到的结果便是一个零部件稍多的产品,将会自动生成很多的工程图文件,不便于管理。我们的习惯是,按照装配体来出图纸,将一个装配体中的零部件在一个工程图文件中表示。这样表达清楚而且便于管理。恩,这就是现实的问题所在。

然后,我们要考虑可行性:思考了SolidWorks Task Scheduler的实现,发现使用VBA在技术方面可以实现此类功能,并且有一定的规律可以遵守而不需要太多的人为判断就可以达到要求。这里插一句,在使用SolidWorks Task Scheduler 时我发现了一个选项:备份任务文件,而这个任务文件上所记录的正式一段使用VBA写的宏代码。

接下来,需要现场调研确定需求目标:在了解了solidworks使用相应的规范和工艺员在实际工作中的要求后我们对问题目标有了一个比较明确的概念。我们要做的项目需要完成这样的工作:它针对一个产品中的每个装配体生成一个工作图文件,每本工程图文件中需要一张装配体的三视图和其每个子零件的三视图图纸。并将它们存储在和“图纸”文件夹(存放solidworks模型)同级的目录下的“工程图”文件夹里。

做好了准备工作,我们可以开始写程序了。将需求的内容转化成软件问题描述,并描述其大致方法:1、得到产品文件的每个装配体:我们可以通过文件夹中文件的遍历,按照后缀名“.sldasm”来得到一个目录下所有的装配体;也可以通过遍历一个产品总装配体的组件来得到每一个子装配体模型。实际的编码中我们选择了后者,因为它虽然给编写代码结构带来了复杂度,但是正确性和稳定性都要好过前者。装配体的组件是一个树型结构,使用递归式是比较灵活的方法,前面章节也已经介绍过。2、生成工程图并插入零件的模型三视图:SolidWorks Task Scheduler使用预定义的模型视图来完成自动生成的功能,但是,一旦需要在原有的图纸上插入新图纸时,就不能够继承图纸模版的预定义试图了。所以需要使用CreateDrawViewFromModelView2和CreateUnfoldedViewAt3来替代。

一切准备完毕后就可以设计程序框架进行编码了:我们这里定义了三个过程,main、traverseasm、createdraw。它们的定义和完成的作用如下:

Main():模块主函数没有参数和返回值,它得到当前打开装配体的路径、设置“工程图文件夹路径”、运行traverseasm 过程。

Traverseasm(filepath as string):此过程接受一个装配体的存储路径字符串参数,完成装配体的递归遍历工作,得到每一个装配体,并让每一个装配体都作为参数运行createdraw过程。

Createdraw(filepath as string): 此过程接受一个装配体的存储路径字符串参数,生成此装配体的工程图。

'/************************************************************

'drawcreator :根据装配体生成工程图

'zjt 2005-10-12

'

'main:

' get opened asm model infomation:

' filepathname

' drawpathname

' make dir path is drawpathname

' call traverseasm with argument filepathname

'

'traverseasm:

' for itself call createdraw with argument itself

' traverse the asm model component

' for each sub asm model:

' call traverseasm

'

'createdraw:

' create a drawdoc with given drawtemplate

' insert each sub part model component a sheet

'************************************************************/

Option Explicit

'定义部分:

Dim swapp As SldWorks.SldWorks

Dim drawpathname As String

Dim file As String

Dim nErrors As Long

Dim nWarnings As Long

Dim statofanno As Boolean

Dim pos As Integer

'/*********************************************************** 'sub main goes here:

'***********************************************************/

Sub main()

On Error Resume Next

Dim actmodel As SldWorks.ModelDoc2

Dim yesorno As VbMsgBoxResult

Set swapp = CreateObject("SldWorks.Application")

Set actmodel = swapp.ActiveDoc

If actmodel Is Nothing Then

MsgBox "请先打开装配体"

End If

'得到装配体文件路径

file = actmodel.GetPathName

'得到工程图保存路径

drawpathname = Left(file, InStrRev(file, "\") - 1) drawpathname = Left(drawpathname, InStrRev(drawpathname, "\")) drawpathname = drawpathname + "工程图\"

'创建文件夹

MkDir (drawpathname)

'调试信息 :

''debug.print drawpathname

''debug.print file

'should i set all object nothing ?

Set actmodel = Nothing

Set swapp = Nothing

yesorno = MsgBox("需要自动在零件工程图中插入模型项目么?", vbOKCancel, "提示")

If yesorno = vbOK Then

statofanno = True

Else

statofanno = False

End If

swapp.Visible = False

'调用函数遍历装配体组件

traverseasm file

swapp.Visible = True

End Sub

'/**************************************************

'sub traverseasm goes here :

''**************************************************/

Sub traverseasm(filepath As String)

Dim swmodel2 As SldWorks.ModelDoc2

Dim swconf2 As SldWorks.Configuration

Dim swrootcomp2 As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim swchildcomp2 As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim vchildcomp2 As Variant

Dim filetype2 As String

Dim n As Long

Set swapp = CreateObject("SldWorks.Application")

If swapp Is Nothing Then

MsgBox "创建SW对象失败"

Exit Sub

End If

Set swmodel2 = swapp.OpenDoc6(filepath, 2, 0, "", nErrors, nWarnings) 'file open good

If swmodel2 Is Nothing Then

MsgBox "加载装配体失败"

Exit Sub

End If

Set swconf2 = swmodel2.GetActiveConfiguration 'need to change swmodel to traverse

Set swrootcomp2 = swconf2.GetRootComponent

vchildcomp2 = swrootcomp2.GetChildren

For n = 0 To UBound(vchildcomp2)

Set swchildcomp2 = vchildcomp2(n)

filetype2 = UCase(Right(swchildcomp2.GetPathName, 6))

If filetype2 = "SLDASM" Then

traverseasm swchildcomp2.GetPathName

End If

Next

''debug.print swmodel2.GetPathName

If Not Mid(swmodel2.GetTitle, 1, 2) = "镜向" Then

createdraw swmodel2.GetPathName

End If

End Sub

'/**************************************************

'sub createdraw goes here :

'**************************************************/

Sub createdraw(filepath As String)

Dim swmodel As SldWorks.ModelDoc2

Dim swsave As SldWorks.ModelDoc2

Dim swdraw As SldWorks.DrawingDoc

Dim swchildcomp As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim swchildcmp2 As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim swconf As SldWorks.Configuration

Dim swrootcomp As https://www.doczj.com/doc/ba13350564.html,ponent2

Dim cursheet As SldWorks.Sheet

Dim swview As SldWorks.View

Dim vchildcomp As Variant

Dim sheetarr As String

Dim spadstr As String

Dim asmfile As String

Dim drawfile As String

Dim drawdir As String

Dim drawtemp As String

Dim destring As String

Dim tmpstring As String

Dim stmpstr As String

Dim filetype As String

Dim sheetname As String

Dim viewname As String

Dim sfilename As String

Dim file As String

Dim i As Long

Dim isok As Boolean

Dim wgood As Integer

asmfile = filepath

drawdir = drawpathname

'for easy to use i specified a template file

drawtemp = swapp.GetExecutablePath & "\lang\chinese-simplified\Tutorial\auto.DRWDOT"

sheetarr = "ardenmakeastupidwaybutrunsok"

Set swapp = CreateObject("SldWorks.Application")

If swapp Is Nothing Then

MsgBox "创建SW对象失败"

Exit Sub

End If

Set swmodel = swapp.OpenDoc6(asmfile, 2, 0, "", nErrors, nWarnings)

If swmodel Is Nothing Then

MsgBox "打开装配体失败"

Exit Sub

End If

swmodel.EditRebuild3

'创建drawdoc文档

Set swdraw = swapp.NewDocument(drawtemp, 2, 0.2, 0.4)

If swdraw Is Nothing Then

MsgBox "创建工程图失败"

Exit Sub

End If

Set cursheet = swdraw.GetCurrentSheet

'插入模型到预定义视图

isok = swdraw.InsertModelInPredefinedView(asmfile)

If isok = False Then

MsgBox "插入装配体三视图失败"

End If

destring = swmodel.GetTitle

tmpstring = Left(destring, InStrRev(destring, ".") - 1)

If InStrRev(tmpstring, " ", -1, vbTextCompare) <= 0 Then

destring = tmpstring

' notice : need to write more to modify it

Else

destring = Replace(tmpstring, Left(tmpstring, InStrRev(tmpstring, " ") - 1), "") End If

'sheet名称设定规则:模型名称(不包括物料编码)+三视图

cursheet.SetName (destring + "三视图")

Set swview = swdraw.GetFirstView

https://www.doczj.com/doc/ba13350564.html,eSheetScale = True '设置为图纸比例 does it works right?

''debug.print https://www.doczj.com/doc/ba13350564.html,eSheetScale

'''debug.print "the sheet name is : " & destring + "三视图"

'save draw file but do not open it

wgood = swmodel.SaveAs2(drawdir + tmpstring + ".SLDDRW", 0, False, True)

'<<<-------------------------------

'''debug.print "save asm draw file state:" & wgood

'''debug.print drawdir & "\" & tmpstring & ".SLDDRW"

If wgood = 0 Then

MsgBox "保存三视图失败"

End If

'-------------------------------->>>

'怎样才能不覆盖保存?

'then traverse all part file next level insert sheet on this draw

'已经将装配体的三视图插入draw文件了

'要遍历装配体:part部分

'swapp.ActivateDoc2 swmodel.GetPathName, True, nErrors

Set swconf = swmodel.GetActiveConfiguration 'need to change swmodel to traverse

'''debug.print "activeconfiguration is :" & https://www.doczj.com/doc/ba13350564.html,

Set swrootcomp = swconf.GetRootComponent

'''debug.print "rootcompoent is :" & https://www.doczj.com/doc/ba13350564.html,

vchildcomp = swrootcomp.GetChildren

'--------开始对装配体下一层组建进行遍历,忽略子装配体,只将本身和子零件出图-------

'--------------------------------------------------------------------------

'------------------------------begin loop-----------------------

For i = 0 To UBound(vchildcomp)

'''debug.print "enter loop 0 to " & UBound(vchildcomp)

Set swchildcomp = vchildcomp(i)

'-------------------------------------

If i < UBound(vchildcomp) Then

Set swchildcmp2 = vchildcomp(i + 1)

Else

Set swchildcmp2 = vchildcomp(0)

End If

'--------------------------------------

'''debug.print "sub comp " & i & " name is : " & https://www.doczj.com/doc/ba13350564.html,

filetype = UCase(Right(swchildcomp.GetPathName, 6))

If filetype = "SLDPRT" Then ‘如果是零件,插入图纸

If swdraw Is Nothing Then

'''debug.print "swdraw is nothing"

Else

'''debug.print "swdraw has :" & swdraw.GetSheetCount & "sheets"

End If

'//---------------- 得到图纸名称----------------------

stmpstr = swchildcomp.GetPathName

''debug.print "1: " & stmpstr

stmpstr = Left(stmpstr, InStrRev(stmpstr, ".") - 1)

''debug.print "2: " & stmpstr

stmpstr = Right(stmpstr, Len(stmpstr) - InStrRev(stmpstr, "\"))

''debug.print "3: " & stmpstr

If InStr(stmpstr, " ") <= 0 Then

sheetname = LTrim(stmpstr)

Else

sheetname = LTrim(Replace(stmpstr, Left(stmpstr, InStrRev(stmpstr, " ") - 1), ""))

End If

'---------------- 得到图纸名称----------------------//

Debug.Print "sheetname:" & sheetname

Debug.Print "sheetarr" & sheetarr

' 忽略镜像零部件

If Not Mid(sheetname, 1, 2) = "镜向" Then

'//-------------------------------------如果重复跳过---------------------------------------------------

If Not swchildcomp.GetPathName = swchildcmp2.GetPathName Then

'//------------------------也是判断有没有这个表------------------

If InStr(1, sheetarr, sheetname, vbTextCompare) = 0 Then

' If Not InStrRev(1, sheetarr, sheetname, vbTextCompare) = 0 Then

swdraw.NewSheet3 sheetname, 12, 12, 1#, 10#, True, "美克A4横.slddrt", 2, 2, ""

sheetarr = sheetarr & sheetname

Debug.Print "add" & sheetarr

swdraw.ActivateSheet sheetname

Set cursheet = swdraw.GetCurrentSheet

cursheet.SheetFormatVisible = True

'cursheet.SetTemplateName drawtemp

'''debug.print "part fullname is :" & swchildcomp.GetPathName

'swdraw.InsertModelInPredefinedView swchildcomp.GetPathName

'//----------------------------------------- 创建三视图-----------------------------

Set swview = swdraw.CreateDrawViewFromModelView2(swchildcomp.GetPathName, "*前视", 0.07954434782609, 0.09376565217391, 0)

'''debug.print "viewname is :" & https://www.doczj.com/doc/ba13350564.html,

viewname = https://www.doczj.com/doc/ba13350564.html,

'''debug.print "swview name is :" & viewname

swdraw.Extension.SelectByID2 viewname, "DRAWINGVIEW", 0, 0, 0, False, 0, Nothing, 0

swdraw.ActivateView viewname

Set swview = swdraw.CreateUnfoldedViewAt3(0.2224917391304, 0.09376565217391, 0, 0) '上视

swdraw.ClearSelection2 True

swdraw.Extension.SelectByID2 viewname, "DRAWINGVIEW", 0, 0, 0, False, 0, Nothing, 0

Set swview = swdraw.CreateUnfoldedViewAt3(0.07954434782609, 0.1534239130435, 0, 0) '右视

swdraw.ClearSelection2 True

十年相伴 共创经典 Discuz!系列经典产品回顾

《站长》杂志第28期内容推介 十年相伴共创经典Discuz!系列经典产品回顾 站长朋友们,是否还记得Discuz! 官网那些5年前的老ID旧面孔?是否还记得曾经的Discuz! 1.0 、Discuz! 1.0 和Discuz! 5.5“长”得什么模样?在过去的十年里,senz在站长的陪伴下一路走来,推出了数款经典产品,成为社区动力,引领社区潮流发展。在即将迎来senz十周年之际,《站长》杂志特别回首过去十年来的数款经典Discuz! 产品,以及那些始终陪伴左右的站长朋友,谨以对更多陪伴Discuz! 、支持Discuz! 的站长们表示由衷的感激。 Discuz! 1.0 ——Discuz! 起点站 大C在开发Discuz! 1.0 的时候,一定不会想到之后商业化的Discuz! 1.0 、免费开源的Discuz! 4.0 、以及现在“跨界融合”的Discuz! X 系列;Discuz! 1.0 的各项功能、模板也可

能是Discuz! 系列中最简陋的,最朴素的,但没有它,也就没有后来的数个经典产品。所以,Discuz! 1.0 就像是Discuz! 系类产品的“起点站”和“加油站”一样,不断的激励着Discuz! 的后续产品一步步的改进、创新,引领社区发展潮流。 许多的草根站长,不也是这样一步步发展起来的吗?许多业已取得成功的站长,在初建社区的时候,也未曾想过能取得今天的人气与盈利,只是抱着许三多“不抛弃、不放弃”的信念从小做大,根据市场需求逐步改进自己的产品,一步步走向了成功。这种“从小到大”、“坚持不放弃”、“以市场为导向”的理念不仅是说Discuz! 1.0 ,也同样适用于社区。 Discuz! 2.0 ——商业化

phpcms_v9二次开发手册

PHPCMS二次开发教程 文件目录结构 根目录 | – api 接口文件目录 | – caches 缓存文件目录 | – configs 系统配置文件目录 | – caches_* 系统缓存目录 | – phpcms phpcms框架主目录 | – languages 框架语言包目录 | – libs 框架主类库、主函数库目录 | – model 框架数据库模型目录 | – modules 框架模块目录 | – templates 框架系统模板目录 | – phpsso_server phpsso主目录 | – statics 系统附件包 | – css 系统css包 | – images 系统图片包 | – js 系统js包 | – uploadfile 网站附件目录 | – admin.php 后台管理入口 | – index.php 程序主入口 | – crossdomain.xml FLASH跨域传输文件 | – robots.txt 搜索引擎蜘蛛限制配置文件 | – favicon.ico 系统icon图标

PHPCMS V9 核心文件说明 模块与控制器 模块: phpcms v9框架中的模块,位于phpcms/modules目录中每一个目录称之为一个模块。即url访问中的m。 访问content模块示例:https://www.doczj.com/doc/ba13350564.html,/index.php?m=content 控制器: phpcms v9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。类名成就是文件名+.php,例如一个名为abc的控制器,那么他的命名为abc.php即可。控制器类默认继承系统的函数库,可以直接使用。控制器类的类名称与控制器文件名必须相同。如果您创建了一个abc.php在 test模块下,那么我们在浏览器里面输入URL:https://www.doczj.com/doc/ba13350564.html,/index.php?m=test& c=abc 二次开发技巧 如果要对已存在的控制器进行二次开发,为了方便升级不建议直接对内核文件直接修改该,您可以通过“MY_*.php”的形式进行二次开发。 例如您要对改phpcms/mood/index.php进行二次开发。您可以在与index.php同级的目录下建立"MY_index.php"

discuz X2二次开发帮助文档

相信有不少人热衷于基于修改原有系统文件所做的插件,当然了解程序文件功能是最重要的,下面我把Discuz! X2.0主要的程序文件功能说一下。我只是整理,不是自己原创编辑的,所有权归原创作者所有哦。 Tips: Q:针对说明的文件是? A:我只基于原版文件对upload目录中基本的程序文件(php,htm,js,除了极少数无关紧要的)进行解释,其余文件(如图片文件),一般不做说明 Q:某些目录下空白的index.htm是用来做什么的? A:用来防止列目录的 Q:文件名颜色和标识的意义是? A:粗体表示这个文件比较重要,除非你非常了解其功能,否则修改错误会导致全站瘫痪;斜体表示这个文件已被加密,一般情况下修改没有意义;下划线表示这个文件一般99.99%的修改是用不上的,了解即可 绿色的是函数库文件,蓝色的是常量调用文件,红色的是系统全局核心文件 Q:文件名命名有什么特别规律吗? A:有的,一般inc的是调用文件,func是函数库文件,class是库文件,lng的是语言包文件,了解这些后缀能快速掌握文件功能。 Q:我看了你的帖子,可是我还是看不懂文件内是什么意思啊? A:这个嘛,还是要有一定基础了,一般掌握SQL,PHP和Htm你就可以去改文件做你要的功能了,这个不是我的任务了哦。一般来说,如果随便指个地方,你能在1分钟内说出大概位置及所在的文件,那么你基本就算合格了。不过我个人认为最重要的还是多改多读,在实践中提高自己的能力 下面开始了,请看你的upload目录里面的文件,表述的格式依次为文件名,功能描述等等 先从根目录开始,根目录文件一般都是入口,即执行具体功能的代码一般不在这些文件中,而是在其调用的文件中 admin.php 系统站点管理入口文件 api.php Discuz!合作应用入口文件(例如漫游、支付宝什么的都走这里) connect.php QQ互联入口文件 cp.php 应用入口文件 crossdomain.xml 数据交互文件,如果在里面定义其它站点的地址,那么这两个不同站点就可以交互数据 favicon.ico图标文件,显示在浏览器的标题栏 forum.php 论坛入口文件 group.php 群组入口文件

CATIA二次开发文件_VB

CATIA二次开发文件 第一课:CATIA V5自动化及脚本语言结构内容列表: CATIAV5自动化及脚本语言介绍 VB、VBScript、VBA之间的区别 宏的兼容性、结构及文件 进程中的宏 2.1运行一个宏 2.2在工具栏上添加一个宏 外进程的编程 3.1 使用VBA或VB 运行外进程 例子:从Excel里导出螺钉 3.2使用Windows Scripting Host运行外进程 3.2.1Windows Scripting Host 下的VBScript 例子:“BoltVBScript.vbs” 3.2.2Windows Scripting Host 下的JavaScript 例子:“BoltJavaScript.js” 3.3用HTML运行外进程 3.3.1用VBScript在HTML里运行外进程 例子:“BoltVBScript.html” 3.3.2用JavaScript在HTML里运行外进程 例子:“BoltJavaScript.html”

1.C ATIA自动化及脚本语言概述 通用在Unix和NT平台上 无论是在NT平台还是Unix平台上,脚本语言允许你使用宏以一个非常简单的方式来对CA TIA V5进行编程。 CA TIA V5使用了NT平台下的VB脚本和Unix平台下的BASIC脚本中相同的部分,所以我们在两个平台下可以运行相同的宏。 在NT平台下 自动化允许CATIA与其他程序共享对象,如EXCEL,WORD,VISUAL BASIC。 CA TIA可以使用WORD/EXCEL对象,反之也相同。 在UNIX平台下 将来的CATIA的版本里,CATIA将允许同Java共享自己的对象,这将为Unix平台和NT平台提供完整的兼容性。 CATIA V5 自动化:概述(仅限NT平台) 自动化允许在不同的进程之间通讯 COM:(对象组件模型):COM是微软公司提出的目的在不同程序中共享对象标准。Automation:Automation是一种微软公司的技术,目的是在开发环境里使用COM对象ActiveX组件是一种微软标准,目的是在开发环境里共享不同程序的对象。 OLE:(对象链接及嵌入)意味着一个文件可以被另外的一个程序的文件链接。这种链接及嵌入的对象可以被其他的程序在编辑区编辑。 Visual Basic ,VBA,VBScript之间的区别 Visual Basic(Visual Basic专业版):VB是个完全的版本。 1.可以编制独立的程序。 2.也可以创建ActiveX和程序服务器。 3.可以被编译。 4. VB提供了自己的文档——《在线帮助》 VBA(Visual Basic for Application):VBA是VB的一个子集。 1. VBA是程序中的主机,就象Word,Excel。 2.它提供了一个带有编辑器、除错器、帮助、对象浏览器、完成器的完整的开发环境。3.利用它的Tools-Reference菜单可以声明使用的对象库。这在完成和对象浏览器之间建立了一个通道。 VBScript(Visual Basic Script):VBScript是VB的一个子集。

Discuz教程

Discuz教程 插件制作的基本思路是:(初学者适用) 1.形成插件思路 2.制作插件界面 3.构架程序模块 4.搭建存储数据 5.填充功能语句 6.检查应用错误 7.完善插件功能 前言:为方便互联网数万Discuz!爱好者,更加深入了解Discuz!软件,本人在熟悉Discuz!过程中,顺便将个人经验写给大家。本贴内容由本人定期更新。本贴只介绍Discuz!中部分技术点,本贴紧属个人观点,不足之处,请各位多多指教,在下先此谢过!。“Discuz!”在下文中简称“DZ”。要弄DZ二次开发,必须至少具备如下技能:1)能够理很好理解MVC构架的原理(虽然DZ不是MVC架构的) 2)扎实的PHP基础,熟悉结构化程序,OOP程序的写法及应用 3)熟悉MYSQL就用,掌握SQL语言,懂SQL优化者更佳 4)熟悉使用Discuz!的各项功能 一)Discuz!的文件系统目录 注:想搞DZ开发,就得弄懂DZ中每个文件的功能。 a) Admin:后台管理功能模块 b) Api:DZ系统与其它系统之间接口程序 c) Archiver:DZ中,用以搜索引擎优化的无图版 d) Attachments:DZ中,用户上传附件的存放目录 e) Customavatars:DZ中,用户自定义头像的目录 f) Forumdata:DZ缓存数据的存放目录 g) Images:DZ模板中的图片存放目录 h) Include:DZ常用函数库,基本功能模块目录 i) Ipdata:DZ统计IP来路用的数据 j) Plugins:DZ插件信息的存放目录 k) Templates:DZ模板文件的存放目录 l) Wap:DZ无线,Wap程序处理目录 二)必须记熟Discuz!数据库设计的每个表的功能,每个表中每个字段的功能。 关于DZ数据库设计文档,请参阅DZ相关的项目文档(请从本贴附件中下载) 三)Discuz!的流程控制 a) 后台流程控:DZ后台所有的功能,均需要注册到admincp.php文件,每个功能都至少有一个或一个以上的Action(动作),在admincp.php中,可以定义Action的执行权限,分别为:“admin==1”管理员,或“admin==2 || admin==3”超级版主和版主,每个Action对应一个脚本文件,脚本文件的命名为action.inc.php(*.inc.php),并存放在admin目录下,如执行:admincp.php?action=dodo,相当于执行admin目录下的dodo.inc.php文件 b) 前台流程控制:前台的流程控制比较简单:流程是自由的,如: 首页:index.php 会员注册:register.php; 会员登录:logging.php 发贴程序:post.php 会员信息:member.php 论坛内容:forumdisplay.php 查看贴子:member.php …大部分功能,此处不一一列出… c) DZ根目下的config.inc.php属于整个DZ系统的配置文件 四)Discuz!的数据处理过程 a) DZ对mysql的数据库操作处理全部封装在dbstuff(db_mysql.class.php)类中 b) 所在的外部数据均通过“daddslashes()”初步过滤,然后再过滤,再根据需要处理 五)Discuz!的显示控制(网站多样式风格输出) a) 显示层就是大家通常所看到的网站风格了。DZ中每套风络分别在templates及images下对应一个风格文件的存放目录。网站风格的制作,请参阅详细的DZ风格制作文档 b) DZ网站风格文件处理的原理:其实很简单,DZ使用template.func.php中的parse_template()以PHP正则运算把htm模文件中的模板标签,转换成了PHP代码,并根据styleid保存在forumdata/templates下,这个有点像Smarty 中的技术。 六)DZ中的语言处理 a) DZ前台及后台中、英语言的实现,均是把语句定义成了语变量,然后在模板输入,语句变量的赋值,均放在模板目录中的*.lang.php文件中,DZ在生成网站风格时就加载了这相应的语言包。 七)DZ如何处理用户信息(存取、计算、更新过程)

二次开发文档

Jspxcms无侵入式插件开发(二次开发)教程之一:概述 Jspxcms支持无侵入式插件和二次开发,无需修改系统原有代码,即可无缝整合Entity、Service、Controller、功能菜单、权限、标签、国际化等功能。 系统中“插件--简历管理”就是以这种方式实现的,下面就以“简历管理”讲解Jspxcms插件和二次开发的方法。 本帖隐藏的内容需要回复才可以浏览 配置文件位置:/WEB-INF/conf/plugin。 所有的配置文件都必须在这个目录,在该目录下的配置文件会自动加载。在该目录下新建自己的文件夹,可以是任何名字,如:abc、novel等,本例为plug。即/WEB-INF/conf/plugin/plug 配置文件说明 application.properties:功能菜单、权限、国际化、Entity都与这个文件相关。 context-dao.xml:Dao的加载。 context-service.xml:Service的加载。 controller-back.xml:后台Controller的加载。 controller-fore.xml:前台Controller的加载。 context-directive.xml:标签的加载。 其他与插件开发相关的文件目录 /WEB-INF/messages/plugin/plug:后台国际化文件位置 /WEB-INF/messages/plugin/plugfore:前台国际化文件位置 /WEB-INF/views/plug:后台jsp文件位置 /files/1/bluewise/plug_resume.html:插件的前台模版 插件源代码包名:com.jspxcms.plug Jspxcms无侵入式插件开发(二次开发)教程之二:菜单与权限 本帖隐藏的内容需要回复才可以浏览 菜单和权限配置文件:/WEB-INF/conf/plugin/plug/application.properties 一级菜单配置(分号为分割符) 1.menu.650=navigation.plug;nav.do?menuId=650;nav_plug 复制代码 650:是后台导航一级菜单的编号,编号大小决定菜单的前后位置。其值可以根据需要调整,如330、970,但不要与系统菜单或其他插件菜单重复。系统菜单通常为menu.100,menu.200,menu.600等,系统菜单定义文件在 /WEB-INF/conf/application.properties navigation.plug:菜单名称。这里使用了国际化,也可以直接用中文,比如“我的插件”。 nav.do?menuId=650:菜单链接地址。其中650需与前面的值一样。

discuz数据库详解

Discuz数据表详解方便二次开发 Discuz数据表详解,方便二次开发,有时候还是感觉直接改动数据库比较方便一些 Discuz默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpost 允许发新帖 allowreply 允许回复 allowgetattach 允许下载附件 allowpostattach 允许上传附件 cdb_adminactions 关联用户组 admingid 管理组id disabledactions 关联后的权限 cdb_admingroups 管理组权限设置(3条)admingid 管理组id alloweditpost 允许编辑帖子 alloweditpoll 允许编辑投票 allowstickthread 允许固定主题 allowmodpost 允许编辑帖子 allowdelpost 允许删除帖子 allowmassprune 允许批量删除帖子 allowrefund 允许强制退款 allowcensorword 允许过滤词语 allowviewip 允许查看用户IP信息 allowbanip 允许禁止IP allowedituser 允许编辑用户 allowmoduser 允许审核用户 allowbanuser 允许禁止用户访问 allowpostannounce 允许发布公告 allowviewlog 允许查看版主管理记录和用户评分记录 disablepostctrl 发贴不受***(不受灌水预防和最大字数等) cdb_adminnotes (后台留言表) id 后台留言id admin 留言人 access 阅读权限 adminid 管理组id dateline 发表时间 expiration 过期时间 message 留言内容

ZWCAD二次开发文档简易指南

一.概述 (2) 二.使用SDS进行二次开发 (2) SDS和ADS接口的主要差异 (2) 编译SDS应用程序 (4) 三.使用AUTOLISP进行开发 (4) 四.使用VBA/VB进行开发 (5) 五.ZWCAD的定制 (5) 屏幕菜单及其定制 (5) I MAGE菜单(图标菜单)的定制 (7) PROFILE的定制 (9) ZWCAD.LSP和ZWCAD.SDS文件的作用和定制 (10) 别名的定制 (11) 其他定制 (11)

(内部参考) 一.概述 在zwcad上可以通过二次开发来定制和扩展zwcad的功能.当前的zwcad提供AutoLISP,SDS以及Visual Basic for Applications(VBA,COM)开发包进行二次开发.在zwcad上,你也可以使用许多原来在autocad平台上开发的应用程序.例如使用autolisp编制的程序可以在几乎不用修改的情况下移植到zwcad平台.Zwcad还完整支持AutoCAD Dialog Control(DCL)语言,不需修改.目前的zwcad还不支持Object ARX,DBX. 二.使用SDS进行二次开发 SDS是一个和ADS?(AutoCAD?Development System)开发包相兼容的C/C++语言接口.大部分ads应用程序经过再编译可以直接应用于zwcad。中望建筑就是用sds sdk开发的。下面所述内容均以ads开发包为比较对象,以ads开发程序员为讲解对象.具体的sds函数说明请参考帮助文档. SDS和ADS接口的主要差异 SDS和ADS的接口差异可以直接从sds.h和ads.h这两个头文件的比较得出.主要差异如下. 1.Sds开发包的接口函数以sds_为前缀. Ads开发包的接口函数主要以ads_,acad_,and acrx_等为前缀. 在sds.h中提供了移植ads用的宏 例如#define ads_entdel sds_entdel 这样只需要在ads应用程序源代码中将#include“ads.h”以#include “sds.h”替换,并将要链接的库文件改为sds.lib编译链接即可完成从ads到sds的移植. 2.sds开发包主要扩展的函数 #if defined(_WINDOWS_) HDC*sds_getviewhdc(void); int sds_getrgbvalue(int nColor);RGB HPALETTE sds_getpalette(void); HWND sds_getviewhwnd(void); HWND sds_getmainhwnd(void); int sds_drawLinePattern(HDC h_dc,RECT rect,struct sds_resbuf*lineParam);

Discuz! 道具系统道具开发文档

Discuz!道具系统采用独立的php文件的道具结构,每个道具拥有一个单独的php文件,做为这个道具运行文件,用户可以自行编写道具文件制作属于自己论坛的道具。下面具体介绍一下相关机制和开发方法 1、道具的组成 每个道具由两部分组成,php文件和图片文件。 php文件存放在论坛include/magic目录下,命名规范为magic_inc_道具名称.php文件。图片文件存放在images/magics目录下,命名规范为道具唯一标识(小写).gif 注:其中道具名称由任意英文字母组成,道具唯一标识是在添加的时候确定的,此标识唯一,最长为3个大写英文字母 道具图片不用多说就是gif文件,下面我具体说说php文件编写规范 2、道具php文件编写详解 我们以一个道具php文件(magic_inc_close.php)为例 1.

discuz文件目录及文件总结

Discuz文件目录及文件功能总结 先从根目录开始,根目录文件一般都是入口,即执行具体功能的代码一般不在这些文件中,而是在其调用的文件中 ◆admin.php 后台管理入口文件 ◆api.php Discuz!合作应用入口文件(例如漫游、支付宝等) ◆connect.php QQ互联入口文件 ◆cp.php应用入口文件 ◆crossdomain.xml 数据交互文件,如果在里面定义其它站点的地 址,那么这两个不同站点就可以交互数据 ◆favicon.ico 图标文件,显示在浏览器的标题栏 ◆forum.php 论坛入口文件 ◆group.php 群组入口文件 ◆home.php 家园入口文件 ◆index.php 门户入口文件,功能与portal.php基本相同 ◆member.php 用户信息入口文件 ◆misc.php 网站用户常用操作入口文件,例如像评分、收藏等功能 都是走这个文件的 ◆plugin.php 插件入口文件 ◆portal.php 门户入口文件 ◆robots.txt 在这个文件中加上具体的地址,可以防止被搜索蜘蛛检 索到 ◆search.php 搜索功能入口程序 ◆userapp.php 用户应用入口程序 API目录中的文件主要是和Discuz!进行合作的商家的应用程序,一般不要也无需修改 ●api ┄┄┄外部接口 ?addons ?connect ┄┄┄腾讯互联 connect.php ┄┄┄ like.php ┄┄┄ server.php ┄┄┄ ?db ┄┄┄UCenter数据库备份接口 ?google ┄┄┄Google引擎使用 ?javascript ┄┄┄数据和广告的 JS调用 ?manyou ┄┄┄manyou应用及搜索等相关服务

二次开发培训文档

二次开发培训文档 1、ECOLOGY系统框架结构 1、主要的程序结构 Ecology Classbean 存放编译后的CLASS文件 js 系统中使用的JAVASCRIPT和VBSCRIPT脚本 Css 系统中JSP页面使用的样式 Images Images_face Images_frame 系统中使用的图片的存放目录 Crm . . Workflow 该功能分文件夹存放每个功能的文件 WEB-INF Prop 系统配置文件存放 Service 系统的接口配置文件的存放 2、说明一个JSP页面,一个JAVA程序的基本组成,如何阅读JSP 页面 1、一个jsp页面通常需要包含什么内容 2、如何阅读一个JSP页面 由于ECOLOGY系统支持多语言,因此在JSP页面上一般不出现 中文,全部使用标签的形式来显示中文: 比如:在IE上显示“姓名”那么在JSP页面中将通过 <%=SystemEnv.getHtmlLabelName(413,user.getLanguage())%>这 样的形式来表示,其中的数字413就是表示姓名,同时可以通 过“select labelname from htmllabelinfo where indexid=413 and languageid=7”来获取到“姓名”这个显示名称,其中languageid=7 表示中文显示名称,languageid=8表示英文显示名称. 3、JAVA程序的基本组成 在ECOLOGY中开发JAVA程序建议继承weaver.general. BaseBean,在BaseBean中主要封装了两个方法:写日志文件,获 取配置文件中的参数值。

CAD二次开发手册

VBA 开发手册

第一章 VBA 入门 了解嵌入和全局 VBA 工程 AutoCAD VBA 工程是代码模块、类模块和窗体的集合,它们组合起来以执行给予的功能。工程可保存在 AutoCAD 图形中,或作为独立的文件保存。 嵌入工程是保存在 AutoCAD 图形中。当包含有这些工程的图形中 AutoCAD 打开时,他们可以自动地装载,这种方法可以很方便地分发工程给用户。嵌入工程也有它的极限,它不能打开或关闭 AutoCAD 图形,那是由于他们的函数只存在于工程所在的文档中。使用嵌入工程不需要在运行程序之前查找并装载工程文件。举个含有嵌入工程的图形的例子,当图形打开时,一个时间日志被触发。通过这样一个宏的应用可以登记并记录用户在该图形上所花费的时间。这时用户不必去记住在打开图形之前装载工程,这就是自动操作的一个很好的例子。 全局工程保存在独立的文件中,它更加通用,因为他们能在 AutoCAD 图形中运行,也能打开、关闭 AutoCAD 图形,但它在图形打开时不能自动装载。用户必须知道他们所需要的宏包含在哪个工程文件中。然而,全局工程非常容易与其它使用者共享,它可以将通用的宏做为很好的库而存在。举个例子,你保存在一个工程文件中的宏是有关多个图形的材料清单。这个宏可以在工作周期的末期由管理员运行,这样就可以收集到所有图形的信息。 在特定的时间,用户可以在同个 AutoCAD 进程中同时装载嵌入工程和全局工程。 AutoCAD VBA 工程与 Visual Basic 工程在二进制结构上是不兼容的。然而,其中的窗体、模块和类可以通过在 VBA IDE 环境中使用输入和输出 VBA 命令来在工程之间进行转换。关于 VBA IDE 的更多信息,可以查看“用 VBA IDE 编辑工程” 用 VBA 管理器组织工程 你可以使用 VBA 管理器查看装载在当前 AutoCAD 进程的所有 VBA 工程。VBA 管理器一个AutoCAD 工具,它允许你装载、卸载、保存、创建、嵌入和分离 VBA 工程。 打开VBA 管理器的步骤: 1. 在工具菜单中选择宏-VBA 管理器。 2. 或者,在 AutoCAD 中调用 VBAMAN 命令。 本节的内容: 装载现存的工程 当你装载工程到AutoCAD 中,所有的公用的子程序(也称为宏)都可以使用。 嵌入于图形中的工程在图形打开时就被装载。保存在DVB 文件中的工程必须单独装载。 装载现存的VBA 工程文件 1. 在 VBA 管理器中,使用装载项可弹出打开VBA 工程对话框。 2. 在打开 VBA 工程对话框中,选择打开的工程文件。该VBA 工程对话框允许你打开有效的DVB 文件。如果你尝试打开不同类型的文件,你将会得到出错信息。 3. 选择打开。 本章将为你介绍 AutoCAD VBA 工程及VBA 交互开发环境(VBA IDE)。尽管大部分VBA 环境在行为上都是相似的,但AutoCADVBA IDE 还是有些独有的特性。在AutoCAD 中还有些相关的命令可以用于装载工程、运行工程,或打开VBA IDE 环境。本章将概要介绍VBA 工程、VBA 命令和VBA IDE 的使用。

Jeecms二次开发相关文档(入门)

Jeecms二次开发相关文档(入门) 目录: (本文档中内容整理自网络并结合自己实际开发经验总结而来,文档后有相关内容引用出处,本处声明免责,不承担任何纠纷,文档供大家交流使用) Jeecms二次开发相关文档(入门) (1) 一、jeecms内部请求转发运行原理 (2) 二、jeecms使用freemarker标签示例及原理 (4) 1、标签使用示例 (4) 2、标签原理 (4) 3、自定义标签(实例演示说明标签用法) (7) 三、在MyEclipse工作环境中构建jeecms项目 (10) 1、搭建Jeecms的运行环境 (10) 2、安装jeecms演示系统 (10) 3、导入Jeecms项目 (10)

一、jeecms内部请求转发运行原理 Jeecms中有众多的配置文件,单xml配置文件就相当繁多,各个文件间的关联查找使用关系也不像简单的struts配置文件一样。如首页的显示过程如下。 系统架构是ssh+freemarker模板构成的,所以先要熟悉freemarker模板技术。 先看web.xml文件,其中欢迎页面有: index.jspa index.do index.html 接着再看jeecms/core/struts-core-front.xml配置文件,发现有个action的通用配置: ${namespace} ${actionName} struts收到请求以后,将请求转发到core.dynamicSystemAct这个对象,注意这个这个class并不是真正的类,是类的别名,由spring通过标注@Controller进行绑定,web应用上下文可以通过classpath自动扫描到这个类。 @Controller("core.dynamicSystemAct") public class DynamicSystemAct

A1系列二次开发手册范本

前言 本使用手册详细说明了捷宝A1平台系列抄表机(JBA188,JBA168,JBA198)的二次开发工具,开发流程,API函数,以及通讯动态库函数,请在使用前仔细阅读该使用手册,以便保证您的正确使用和工作效率,敬请妥善保管以备日后查阅之用。如发现本手册有编写错误之处,请予以指出,以便更正,!

目录 前言 (1) 二次应用程序开发说明 (3) 1.1 CBJTOOL安装 (3) 1.2编写应用程序 (3) 1.3编程注意事项: (3) 1.4编译程序 (3) 1.4.1 Cbjtool编译工具 (3) 1.4.2编译步骤 (3) 1.5下装文件 (4) 1.6工程文件操作 (4) 二次开发接口介绍 (5) 2.1数据类型 (5) 2.1.1基本数据类型 (5) 2.1.2消息 (5) 2.1.3显示区域 (6) 2.1.4光标 (6) 2.2键盘接口函数 (7) 2.3LCD接口函数 (7) 2.4底层输出函数 (8) 2.5GDI接口显示函数 (8) 2.6蜂鸣器与时钟接口函数 (12) 2.6.1 蜂鸣器函数 (12) 2.6.2 时钟接口 (12) 2.6.3 定时器接口 (13) 2.7文件操作函数 (14) 2.8数据库操作函数(BDC.H) (15) 2.9GUI组件库函数 (17) 2.10消息处理函数 (30) 2.10.1系统消息处理 (30) 2.10.2 GUI消息处理 (31) 2.11标准C数据转换函数 (32) 2.12标准C字符串函数 (33) 2.13图标资源 (34) 2.14串行通讯类 (34) 2.15权限管理类 (36) 2.16环境变量类 (36) 2.17输入法接口 (38) 2.18系统服务调用 (39)

免费建站程序大全

免费建站程序大全 如今科技日新月异,任何科技发展都是为了让事情变得更简单和快捷,互联网技术也一样,国内也出现了一批很专业的专门用于做网站的建站程序,有的甚至支持多语言,多站点,总之有一句话说得好,站在巨人肩上会看的更高,一样道理,不是每个想拥有网站的人都会编写程序,所有利用网站程序来制作网站就是一个非常省力,省时的过程,国内很多网站90%都是基于这些专业系统基础上搭建,当然,选中一个系统后你需要去熟悉这个系统功能你才能运用得很好,只需要花几天时间看看教程就可以熟练运用并建站,下面收集了国内一些比较常用和知名的程序,大家可以根据自己要做的网站类型去下载对应的系统,系统地址这里就不发了,自己百度一下就能找到(如果你这个都找不到,建议你回家种地) 用过帝国、用过新云、pageadmin 、dedecms等系统,在此,长话短说,把觉得对新手比较有用的心得稍微整理下。 1、帝国,是一个比较完整的系统,在功能上很不错,但它的免费版本在二次开发上是比较要求高的,尤其是对于新手,要读懂它的所有程序功能使用,就要花上好一段时间,如果你对语言不熟悉的话,那就更加困难了,如果是新手建议不用帝国。 2、dedecm,大家应该有听过,功能很强,算国内最成功的cms,但是要求比较高,如果要二次开发或修改,必须很熟悉php程序才可能实现 3、pageadmin,是一款值得称赞的系统,功能设计比较灵活,扩展性也很抢,很多站长使用它来建站,原因很简单,做一个网站1天就能搞定。 2、新云,界面清新,本人比较喜欢,适合做行业站,下载站点最适合不过了,国内很多知名下载站都是用新云的系统。 下面收集了一些其他类型网站系统 论坛 1、Discuz系统 2、Phpwind系统 3、BBSMAX系统 商城:用来做在线购物网站 1、Ecshop 2、ShopEX

Discuz模板引擎标签

Discuz模板引擎标签 2009-06-03 09:18 Discuz! 的模板采用近似 PHP 表达式的语法,支持的元素如下: 1. 逻辑元素包围符,该符号用于包含条件和循环元素,其中: statement1 statement2 statement3 为一个典型的条件模板,当条件 expr1 为真时,显示模板 statement1 内容;否则当 expr2 为真时,显示模板 statement2 内容,否则显示模板 statement3 的内容.如同 其他语言中的条件控制一样,其中 和 是非 必须的. statement 相当于 PHP 的数组循环语句 foreach($array as $value) { statement } 而 statement 相当于 PHP 的数组循环语句

foreach($array as $key => $value) { statement } 逻辑元素包围符在 { } 外面包含了 html 的注释符号 ,除了为了和信息元素 相区别外,也方便了使用 Dreamweaver 和 Frontpage 之类工具编辑模板的用户.因逻 辑元素会被识别为 html 的注释而不被显示,对于绝大多数用户,逻辑元素中的内容是 完全不需要修改的,甚至修改错一个字符就可能引起错误信息和整个系统无法运行.因 此通常您在修改模板的时候,不要修改模板的逻辑信息,更不要将逻辑信息内部元素(如 等)的位置,否则可能会导致错误.如果您的模板被不慎修改损坏,请立 即用原始模板覆盖,即可恢复. 对于高手而言,实际上外部的 是可以省略不写的,可以用于某些元素在模板 中的定位,但强烈建议普通用户不要轻易尝试. 2. { ... } 信息元素包围符,其中 {CONSTANT} 可以引用界面替换变量,其中必须为大写字母,该符号实际的作用是引用 PHP 常量 CONSTANT,因此也可以通过它来引用其他的常量内容. {lang variable} 可以在模板中引用语言变量 variable 的内容,语言变量经由 https://www.doczj.com/doc/ba13350564.html,ng 中数组 $language 定义. 如 {lang post_edit} 的内容在编译模板的时候被替换为 $language['post_edit'] 的内容,简体中文版的意思是 "编辑帖子". {faq variable} 可以在模板中引用论坛帮助的帮助关键字,在后台=>其他设置=》论坛帮助=》具体某个帮助的详情可以看到或者设置 3. {template name} 模板嵌入符,为了避免模板的冗长,可以使用本符号来将 name 模板的内容嵌

最全的discuz二次开发讲解教程

最全的discuz二次开发讲解教程 以下教程希望对各位读者有所帮助 前言:为方便互联网数万Discuz!爱好者,更加深入了解Discuz!软件,本人在熟悉Discuz!过程中,顺便将个人经验写给大家。本贴内容由本人定期更新。本贴只介绍Discuz!中部分技术点,本贴紧属个人观点,不足之处,请各位多多指教,在下先此谢过!。“Discuz!”在下文中简称“DZ”。要弄DZ二次开发,必须至少具备如下技能: 1)能够理很好理解MVC构架的原理(虽然DZ不是MVC架构的) 2)扎实的PHP基础,熟悉结构化程序,OOP程序的写法及应用 3)熟悉MYSQL就用,掌握SQL语言,懂SQL优化者更佳 4)熟悉使用Discuz!的各项功能 一)Discuz!的文件系统目录 注:想搞DZ开发,就得弄懂DZ中每个文件的功能。 a) Admin:后台管理功能模块 b) Api:DZ系统与其它系统之间接口程序 c) Archiver:DZ中,用以搜索引擎优化的无图版 d) Attachments:DZ中,用户上传附件的存放目录 e) Customavatars:DZ中,用户自定义头像的目录 f) Forumdata:DZ缓存数据的存放目录 g) Images:DZ模板中的图片存放目录 h) Include:DZ常用函数库,基本功能模块目录 i) Ipdata:DZ统计IP来路用的数据 j) Plugins:DZ插件信息的存放目录 k) Templates:DZ模板文件的存放目录 l) Wap:DZ无线,Wap程序处理目录 二)必须记熟Discuz!数据库设计的每个表的功能,每个表中每个字段的功能。 关于DZ数据库设计文档,请参阅DZ相关的项目文档(请从本贴附件中下载) 三)Discuz!的流程控制 a) 后台流程控:DZ后台所有的功能,均需要注册到admincp.php文件,每个功能都至少有一个或一个以上的Action(动作),在admincp.php中,可以定义Action的执行权限,分别为:“admin==1”管理员,或“admin==2 || admin==3”超级版主和版主,每个Action对应一个脚本文件,脚本文件的命名为action.inc.php(*.inc.php),并存放在admin目录下,如执行:admincp.php?action=dodo,相当于执行admin目录下的dodo.inc.php文件 b) 前台流程控制:前台的流程控制比较简单:流程是自由的,如: 首页:index.php 会员注册:register.php; 会员登录:logging.php 发贴程序:post.php

discuz!最新版本(x3.0测试版)测评

discuz!最新版本(x3.0测试版)测评 来源:母婴知识网 论坛 1、导航栏更新为浮动,也就是说网页拉到下面导航栏可以浮动于上部,跟phpwind有点相似,也许这就是所谓的技术融合吧; 2、新增加了首页4格,有日期、星期等提示,但这个四格我认为极其丑陋,还不如自己写一个四格来,反正我是不会用的; 3、底部多了“小黑屋”,看上去很神秘的东西一样,其实就是“违纪”单; 4、快捷导航除了保留原有的,增加了对版块的导航,可以快速定位的新的版块; 5、在帖子内页和列表中增加了在“返回顶部”处增加了一个“返回版块”,可以快速返回到该版块; 6、在帖子列表处增加了预览帖子内容的功能,类似于google搜索时的网页预览功能(不是网页快照); 7、在帖子列表上方增加统计本版块在全部版块的排名(应该是以帖子数量)、帖子数量趋势等; 8、在论坛的可视化编辑器中,增加了四个元素:①、目录,可以给本帖子生成目录,方便查看;②、帖子背景,可以给帖子添加背景,自带14套皮肤;③、帖子密码,可以给该帖子设置访问密码;④、添加起始动画,可插入flash、图片等; 9、搜索框采用了x2.5时官方清晰版模板的风格。 门户 1、x3对于门户来讲可以说具有里程碑意义,因为增加了生成静态页的功能,其特性主要有:①、自定义“静态文件扩展名”,如html和htm等;②、自定义“文章HTML存放根目录”和“专题HTML存放目录”;③、部分自定义“目录结构”,这个要像dede一样可能还要自己二次开发,或者根本不能那样;④、自定义“门户首页静态文件名”;⑤、一键生成静态页。其他的如自动生成等可能需要另外自己开发脚本来实现了。 2、发布门户文章时可以自定义静态页html的文件名,编辑器没有变; 3、门户的diy与x2.5等以往版本兼容性较好。

相关主题
文本预览
相关文档 最新文档