顯示具有 PDM/PLM 標籤的文章。 顯示所有文章
顯示具有 PDM/PLM 標籤的文章。 顯示所有文章

2009年8月1日 星期六

PDM/PLM (SmarTeam) 二次開發 - Lesson Six - 進階功能 - 以資料庫管理專案預建的資料夾結構

此篇是上一篇「建立專案時預建資料夾」的進階版

上一篇是將要欲新增的資料夾名稱及結構寫在程式裡,那其實就跟 SDE 沒啥兩樣了,要修改就很麻煩,除了改程式外還要一一更新客戶端

故此篇要將資料夾的名稱及結構存於資料庫,維護時只要從資料庫下手,改完資料庫後就馬上生效,不用一一更新客戶端

首先先建立一存放資料夾結構的 Table「FolderStructureTest」##CONTINUE##

CREATE TABLE [dbo].[FolderStructureTest](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [ParentID] [int] NULL,
 [FolderName] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL
) ON [PRIMARY]

建立的資料內容如下圖,如果 ParentID 為 null 的表示直接link 於 Project,若有 ID 的表示成為 Folder 子階


再來只要修改上一篇範例中建立資料夾的 function (CreateProjectFoldersTest),改由讀取資料庫即可,其他 function 不改

Function CreateProjectFoldersTest(ByVal SmSession As SmApplic.SmSession, ByVal Operation As SmApplic.ISmOperation, ByVal FirstPar As SmRecList.SmRecordList, ByVal SecondPar As SmRecList.SmRecordList, ByVal ThirdPar As SmRecList.SmRecordList) As String

 Dim Project As ISmObject
 Dim smObject As ISmObject
 Dim sRetObjectID As String
 Project = SmSession.ObjectStore.ObjectFromData(FirstPar.GetRecord(0), False)

 GetConnectionString()
 Dim dbh As New DbHelperSQL(sSH_ConnectionString)
 Dim sSql As String = "select ID, ParentID, FolderName from FolderStructureTest"

 Dim dt As DataTable
 dt = dbh.Query(sSql).Tables(0)

 Dim retObject As ISmObject
 Dim tmpObject As ISmObject
 Dim sProjectID As String = Project.Value("TDMX_ID").ToString()

 Dim i As Integer = 0
 For i = 0 To dt.Rows.Count - 1
  If dt.Rows(i)("ParentID").ToString = "" Then
   retObject = CreateProjectSubfolderTest(SmSession, dt.Rows(i)("FolderName").ToString, Project)
   Dim dv As New DataView(dt)
   dv.RowFilter = "ParentID=" + dt.Rows(i)("ID").ToString
   If dv.Count > 0 Then
    For Each row As DataRowView In dv
      CreateSubfolderTest(SmSession, row("FolderName").ToString(), retObject)
    Next
   End If
  End If
 Next

 Return sRetObjectID
End Function

執行後結果如下圖

2009年7月26日 星期日

PDM/PLM (SmarTeam) 二次開發 - Lesson Five - 進階功能 - 建立專案時預建資料夾

在 SmarTeam 中所有物件的使用是非常彈性的,意思是端看使用者想怎麼增刪改,就決定其呈現的樣貌,這樣容易造成不同專案內所建立的文件或分類結果迥異,導致搜尋及閱讀上的困難

然而幾乎所有公司對專案所需的文件都會有一定的定義及分類,故在新增專案時若能自動建立對應的資料夾來管理分類,不僅可以節省 SmarTeam 使用者的時間,同時也能達到標準化

例如 ##CONTINUE##


所以在使用建立專案時同時也在文件樹建立幾個預設資料夾的功能幾乎是 SmarTeam 的標準二次開發要求

那為何 SmarTeam 不把他列入標準功能呢?因為每間公司的分類結構不同,所以也無法寫成標準功能,所以就需要二次開發

P.S. 其實上面的畫面是由在使用 R19 + SDE 後就有的功能,但 SDE 產生那五個資料夾是固定無法更改的,所以還是要自己寫

以下就來介紹如何如何開發此功能,包含有階層的資料夾結構,同時在新增資料夾時 SmarTeam 不會一直問你是否要當專案子階

  1. 首先當然一樣是建立一個 Script 檔,跟之前都一樣,所以只列重要的 function name
    Function CreateProjectFoldersTest(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer
     ...略...

     Set MyDll = CreateObject("MirdcPDMTool.Tools")
     sRet = MyDll.CreateProjectFoldersTest(SmSession, SmOp, RecListIn1, RecListIn2, RecListOut)

     ...略...
    End Function

  2. 在新增專案後加上 Hook




  3. 在 Visual Studio 新增 CreateProjectFoldersTest 方法
    之前有說過要建立具階層型的資料夾,第一層資料夾是與專案連結並新增於桌面(Desktop),第二層資料夾則是當成第一層的子階,兩種的 link 是不同的,故再寫兩個 function 來新增這兩種 link,分別是
    CreateProjectSubfolderTest() 與 CreateSubfolderTest()

    Function CreateProjectFoldersTest(ByVal SmSession As SmApplic.SmSession, ByVal Operation As SmApplic.ISmOperation, ByVal FirstPar As SmRecList.SmRecordList, ByVal SecondPar As SmRecList.SmRecordList, ByVal ThirdPar As SmRecList.SmRecordList) As String

     Dim Project As ISmObject
     Dim smObject As ISmObject
     Dim sRetObjectID As String

     Project = SmSession.ObjectStore.ObjectFromData(FirstPar.GetRecord(0), False)

     Dim retObject As ISmObject
     Dim tmpObject As ISmObject
     Dim sProjectID As String = Project.Value("TDMX_ID").ToString()

     '如果是第一層就呼叫
    CreateProjectSubfolderTest()
     retObject = CreateProjectSubfolderTest(SmSession, "My Folder 1", Project)
     tmpObject = CreateProjectSubfolderTest(SmSession, "My Folder 2", Project)
     '把第一層的 Folder Object 傳回給
    tmpObject ,並傳給 CreateSubfolderTest() 當成第二層的 parent
     retObject = CreateSubfolderTest(SmSession, "My Folder 2-1", tmpObject)
     retObject = CreateSubfolderTest(SmSession, "My Folder 2-2", tmpObject)
     retObject = CreateProjectSubfolderTest(SmSession, "My Folder 3", Project)

     Return sRetObjectID
    End Function


    Function CreateProjectSubfolderTest(ByVal SmSession As SmApplic.SmSession, ByVal sFolderName As String, ByVal parentObject As ISmObject) As ISmObject

     Dim smObject As ISmObject
     Dim sRetObjectID As String
     Dim SessionUtil As SmarTeam.Std.Interop.SmarTeam.SmUtil.SmSessionUtil  'main SmarTeam service object

     Dim folderClass As ISmClass
     folderClass = SmSession.MetaInfo.SmClassByName("Folder")
     Dim MainClassId As Integer 'class id for Sm main class
     Dim SmClassAttributes As SmApplic.ISmClassAttributes 'Sm object attributes
     Dim SmClassAttribute As SmApplic.ISmClassAttribute 'Sm object attribute
     Dim StartMask As String 'start mask for attribute
     Dim NextMask As String 'next mask for attribute

     MainClassId = folderClass.ClassId
     SmClassAttributes = folderClass.Attributes
     SmClassAttribute = SmClassAttributes.ItemByName("TDMX_ID")
     SessionUtil = SmSession.GetService("SmUtil.SmSessionUtil")

     StartMask = SessionUtil.RetrieveStartMaskValue(SmClassAttribute)
     NextMask = SessionUtil.RetrieveNextMask(SmClassAttribute, StartMask)

     smObject = SmSession.ObjectStore.NewObject(folderClass.ClassId)
     smObject.AddAllAttributes()
     smObject.AddAttributes("TDMX_ID")
     smObject.AddAttributes("TDM_DESCRIPTION")
     smObject.Value("TDMX_ID") = NextMask
      smObject.Value("TDM_DESCRIPTION") = sFolderName
     '讓 SmarTeam 在產生 link 不一直彈出視窗問是否當子階的關鍵,把 Behavior 設成 Silent
     Dim Silent As ISmBehavior
     Silent = SmSession.ObjectStore.DefaultBehavior.Clone
     Silent.ConfirmOperations = ConfirmOperationEnum.coYesToAll
    'Silent.InvokeScripts = True
    smObject.InsertEx(Silent)

     Dim retObject As ISmObject = smObject.Clone()

     ' Adds object to desktop tree
     Dim smLinkObject As ISmObject
     Dim smLinkClassId As Integer = 0
     smObject.AddToDesktopEx(parentObject, smLinkClassId, Silent, smLinkObject, smObject)

     Return retObject
    End Function


    Function CreateSubfolderTest(ByVal SmSession As SmApplic.SmSession, ByVal sFolderName As String, ByVal parentObject As ISmObject) As ISmObject

     Dim smObject As ISmObject
     Dim sRetObjectID As String
     Dim SessionUtil As SmarTeam.Std.Interop.SmarTeam.SmUtil.SmSessionUtil 'main SmarTeam service object

     Dim folderClass As ISmClass
     folderClass = SmSession.MetaInfo.SmClassByName("Folder")
     Dim MainClassId As Integer 'class id for Sm main class
     Dim SmClassAttributes As SmApplic.ISmClassAttributes 'Sm object attributes
     Dim SmClassAttribute As SmApplic.ISmClassAttribute 'Sm object attribute
     Dim StartMask As String 'start mask for attribute
     Dim NextMask As String 'next mask for attribute

     MainClassId = folderClass.ClassId
     SmClassAttributes = folderClass.Attributes
     SmClassAttribute = SmClassAttributes.ItemByName("TDMX_ID")
     SessionUtil = SmSession.GetService("SmUtil.SmSessionUtil")
     StartMask = SessionUtil.RetrieveStartMaskValue(SmClassAttribute)

     NextMask = SessionUtil.RetrieveNextMask(SmClassAttribute, StartMask)

     smObject = SmSession.ObjectStore.NewObject(folderClass.ClassId)
     smObject.AddAllAttributes()
     smObject.AddAttributes("TDMX_ID")
     smObject.AddAttributes("TDM_DESCRIPTION")
     smObject.Value("TDMX_ID") = NextMask
     smObject.Value("TDM_DESCRIPTION") = sFolderName

     Dim Silent As ISmBehavior
     Silent = SmSession.ObjectStore.DefaultBehavior.Clone
     Silent.ConfirmOperations = ConfirmOperationEnum.coYesToAll
    'Silent.InvokeScripts = True
    smObject.InsertEx(Silent)

     Dim retObject As ISmObject = smObject.Clone()

     ' Add as Child
     Dim LinkObject As ISmObject
     Dim LinkClassId As Integer
     LinkClassId = SmSession.MetaInfo.HierarchicalLinkClassByClasses(folderClass.ClassId, smObject.ClassId)
     LinkObject = smObject.NewLinkToParent(LinkClassId, parentObject)
     LinkObject.InsertEx(Silent)

     Return retObject
    End Function



  4. 測試看看,成果如下

以上就完成簡單但實用的一個功能,本篇的資料夾數目及結構是寫在程式當中,維護上較困難,更新時亦需一一去更新每個 User 端
故下篇會介紹一資料庫來管理資料夾的內容及階層關係,如此一來就可輕易調整

2009年7月20日 星期一

PDM/PLM (SmarTeam) 二次開發 - Lesson Four - 使用 Visual Studio Run-time Debug Tool 來 Debug

上一篇有介紹如何使用 .Net 來開發 SmarTeam 的程式,其實 .Net 能呼叫的 SmarTeam API,用 Smart Script 都能呼叫,除非是要與其他系統連結或設計 WinForm 程式。
使用 .Net 來開發的原因其實很簡單

  1. 連結異質系統
  2. 開發其它表單
  3. 容易 Debug(有 Visual Studio Run-time Debug Tool)
  4. 較容易開發(有 IntelliSense 協助),其實有時查 Script 的語法還頗麻煩##CONTINUE##

這些上一篇其實有提到一些些,故本篇就介紹如何來 Run-Time Debug SmarTeam 的程式

由於我們是另外開發附加的元件,所以直接在 Visual Studio 按 F5 來進入 Debug Mode 是沒有用滴,因為根本不是由 SmarTeam 來觸發
所以就需要有一些簡單的技巧

  1. 首先當然就是在程式中設中斷點,使用上一篇的程式來當範例


  2. 開啟 SmarTeam 並登入,點選 Visual Studio 選單:「偵錯-->附加至處理序」


  3. 選擇 SmarTeam.exe,附加


  4. 啟動 SmarTeam Script Hook,由於本範例是寫在 SmarTeam OnLogin 後,而剛剛也已經 Login 進 SmarTeam 了,所以要從 SmarTeam 的選單來切換使用者


  5. 跳至中斷點,大功告成,可直接在 Debug Mode 下看到 User ID 是 admin,當然在 Debug Mode 下還可做許多事,下許多指令,這裡就不贅述

2009年7月15日 星期三

PDM/PLM (SmarTeam) 二次開發 - Lesson Three - 使用 Script 呼叫 .Net 的 Client 端程式

上一篇有介紹用 Script 來開發 SmarTeam 的客製程式
本篇就介紹如何透過 Script 來呼叫 .Net 開發的客戶端程式
使用的開發工具為 Visual Studio 2005,基本上 2008 也行滴

要在 Visual Studio 中開發 SmarTeam 的應用程式,必須透過 SmarTeam 開放的 API
所以要把使用到的 SmarTeam DLL 加入參考
由於 SmarTeam 將程式安裝於 GAC,在系統中是無法找到相對應的 DLL 及 API 來使用
故首先必須把 GAC 中的檔案還原成 DLL,步驟如下##CONTINUE##
  1. 建立 C:\Program Files\SMARTEAM\Bin\Assembly 來存放萃取出的 DLL 檔
    在命令提示字元中輸入
    if not exist "C:\Program Files\SMARTEAM\Bin\Assembly" md "C:\Program Files\SMARTEAM\Bin\Assembly"
  2. 使用迴圈將 C:\WINDOWS\assembly 中屬於 SmarTeam 的 dll copy 至剛剛開的目錄
    在命令提示字元中輸入
    for /R C:\WINDOWS\assembly %f in (SmarTeam.*.dll) do copy %f "C:\Program Files\SMARTEAM\Bin\Assembly"
  3. 將目錄資訊註冊於登錄檔在命令提示字元中輸入
    call regedit /s RegisterSmarTeamAssemblies.reg
    登錄檔 RegisterSmarTeamAssemblies.reg 內容如下

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\SMARTEAM]@=
    "C:\\Program Files\\SMARTEAM\\Bin\\Assembly"
開發步驟如下
  1. 取得 SmarTeam 的 DLL 後,當然就是開啟 Visual Studio 專案,加入參考
    開啟一個 Visual Basic 的類別庫專案,命名為 MySmarTeamTest


















  2. 加入下列參考,dll 檔剛剛才拿出來過,應該沒忘記放哪吧
    SmarTeam.Std.Interop.SmarTeam.SmApplic.dll
    SmarTeam.Std.Interop.SmarTeam.SmRecList.dll

















  3. 新增一類別,命名為 SmToolTest.vb
    本範例共有兩個 Function
    HelloWorld1 是從 Script 抓取 User ID 傳入 String 型態參數
    HelloWorld2 是將 Script 抓到的重要參數(如 Session)傳給 SmToolTest 來處理,由.Net 程式來抓取 User ID,這樣的好處是在 Visual Studio 開發較方便,有 IntelliSense 可以查 Function,還可以使用 .Net 的 Run-time Debug Tool 來除蟲
    內容如下,

    '別忘了 Import
    Imports SmarTeam.Std.Interop.SmarTeam.SmApplic
    Imports SmarTeam.Std.Interop.SmarTeam.SmRecList

    Public NotInheritable Class SmToolTest
     Function HelloWorld1(ByVal sName As String)
       MsgBox("Hi: " & sName)

       Return ""
     End Function

     Function HelloWorld2(ByVal SmSession As SmSession, ByVal Operation As ISmOperation, ByVal FirstPar As SmRecordList, ByVal SecondPar As SmRecordList, ByVal ThirdPar As SmRecordList) As String

       MsgBox("Hi: " & SmSession.UserMetaInfo.UserLogin)
       Return ""
     End Function
    End Class

    ' IntelliSense









  4. 完成後進行編譯,在專案目錄下會產生 MySmarTeamTest.dll
    但 SmarTeam 是透過底層的 COM 來呼叫,故需把 MySmarTeamTest.dll 註冊成 COM
    在 MySmarTeamTest.dll 同層目錄中新增一文字檔,命名為 regCOM.bat
    檔案內容如下

    c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /u MySmarTeamTest.dll
    c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /tlb /codebase MySmarTeamTest.dll

    完成後執行 regCOM.bat 來註冊
  5. 撰寫與 SmarTeam Hook 的 Script 檔
    於 SmarTeam\script 資料夾中新增一文字檔,命名為 Helloworld.ebs
    內容為
    Function HelloWorld(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer

     Dim MyDll As Object
     Dim sRet As String
     Dim SmSession As SmApplic.SmSession
     Set SmSession = SCREXT_ObjectForInterface(ApplHndl)

     '呼叫剛剛註冊於 COM 的物件
     Set MyDll = CreateObject("MySmarTeamTest.SmToolTest")
     '呼叫 HelloWorld1,傳入 USer ID
     sRet = MyDll.HelloWorld1( SmSession.UserMetaInfo.UserLogin )

     '把 Session 取出來傳給 HelloWorld2
     Dim RecListIn1 As Object
     Dim RecListIn2 As Object
     Dim RecListOut As Object

     Dim SmOp As SmApplic.ISmOperation
     Dim ObjectStore As ISmObjectStore
     Dim RecordListIn As SmRecordList

     On Error GoTo ErrorDetected
     Set ObjectStore = smSession.ObjectStore

     CONV_RecListToComRecordList FirstPar, RecListIn1
     CONV_RecListToComRecordList SecondPar, RecListIn2
     CONV_RecListToComRecordList ThirdPar, RecListOut

     '呼叫 HelloWorld2
     sRet = MyDll.HelloWorld2(SmSession, SmOp, RecListIn1, RecListIn2, RecListOut)

     Set MyDll = Nothing
     HelloWorld = ERR_None
    Exit Function
  6. 掛上 SmarTeam Hook 點,掛在 On Login 後(會管理 SmarTeam 應該都會開啟 Scrip Maintainance 管理工具吧?)















  7. 登入 SmarTeam 就會看到兩次歡迎視窗,大功告成

2009年7月6日 星期一

PDM/PLM (SmarTeam) 二次開發 - Lesson Two - Hello World & 呼叫 COM

不免俗的,還是要來個 Hello World!!
上一篇有介紹如何在 Form 的按鈕中觸發程式
在正式撰寫程式前,首先需先 Check 是否能真的抓到按鈕的 click 事件來觸發程式
故就先寫個 Hello World

程式如下

Function GetProjectData(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer
  MsgBox "Hello World!!"
  GetProjectData = ERR_None
Exit Function


確定能攔截 SmarTeam 的事件後,便可進行更進一步的程式開發
在 SmarTeam 觸發事件後,會傳送五個參數給 Script Function
標準的 SmarTeam Script Function 如下
##CONTINUE##
Function GetProjectData(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer
  1. ApplHndl-->Converts to SmSession using the function SCREXT_ObjectForInterface
  2. OpStr--> A string parameter that contains the name of the standard SMARTEAM operation of the script hook
  3. FirstPar-->A pointer to a record list containing object information received from SMARTEAM.
  4. SecondPar-->A pointer to a record list that contains object, task, or link information.
  5. ThirdPar--> A pointer to a record list containing object or task information to be returned to SMARTEAM.
  6. Return Value-->One of the error-code constants in Table 2. You should always assign a return value.
簡單的說
可透過 ApplHndl 來取得目前的 SmSession
透過 FirstPar SecondPar 來取得當前物件的資訊
若要將運算完的資料傳回 SmarTeam 則透過 ThirdPar

以下以一個例子來說明如何運作
由於在另一個系統中已有公司所有專案的完整資訊
故希望在 SmarTeam 中新增專案時能透過專案ID去該系統取得專案資訊
以減少在 SmarTeam 的重覆輸入及避免發生輸入錯誤
PS. 取另一系統專案資料的程式已透過 .Net 來撰寫並註冊成 COM,程式類別名稱為
PDMTool.Tools


故此程式首先要接收Form 中的專案代號欄位(TextBox)的值
透過此值至另一個系統取得專案的其他資訊後回傳給 SmarTeam 的其他欄位後儲存專案
程式大致如下

Function GetProjectData(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer

  '宣告三個物件用來存放 FirstPar, SecondPar 及 ThirdPar
  Dim RecListIn1 As Object
  Dim RecListIn2 As Object
  Dim RecListOut As Object

  Dim SmSession As SmApplic.SmSession
  Dim SmOp As SmApplic.ISmOperation
  Dim ObjectStore As ISmObjectStore
  Dim RecordListIn As SmRecordList

  Dim MyDll As Object
  Dim ColumnName As String
  Dim sRet As String

  '將
ApplHndl 轉換成 SmSession

  Set SmSession = SCREXT_ObjectForInterface(ApplHndl)
  Set ObjectStore = smSession.ObjectStore

  '將 FirstPar 轉換至 RecListIn1 物件

  CONV_RecListToComRecordList FirstPar, RecListIn1
  CONV_RecListToComRecordList SecondPar, RecListIn2
  CONV_RecListToComRecordList ThirdPar, RecListOut

  '取得 COM 物件
  Set MyDll = CreateObject("PDMTool.Tools")

  '取得Form的專案代號,其欄位為
CN_DOCUNO

  Dim CN_DOCUNO As String
  CN_DOCUNO = RecListIn1.GetRecord(0).ValueAsString("CN_DOCUNO")

  '透過PDMTool.Toolsk的GetProjectData()來取得專案資料,並分別存於 RecListOut 物件,並指派為 SmarTeam Form 的 CN_FIXNO 及 CN_INDATE 欄

  ColumnName = "CN_FIXNO"
  sRet = MyDll.GetProjectData(CN_DOCUNO, "WORKNO")
  RecListOut.AddHeader ColumnName,50 ,sdtChar
  RecListOut.Value(ColumnName,0) = sRet

  ColumnName = "CN_INDATE"
  sRet = MyDll.GetProjectData(CN_DOCUNO, "RDATE")
  RecListOut.AddHeader ColumnName,50 ,sdtChar
  RecListOut.Value(ColumnName,0) = sRet

  '將
RecListOut 透過 ThirdPar 送回給SmarTeam
  CONV_ComRecListToRecordList RecListOut, ThirdPar

  Set MyDll = Nothing
  MIRDC_SH_GetProjectData = ERR_None
Exit Function

2009年7月5日 星期日

PDM/PLM (SmarTeam) 二次開發 - Lesson One - 入門知識

PDM/PLM種類
PDM/PLM 軟體有相當多種,國外較知名的有
  1. SmarTeam(Dassault)
  2. Windchill(PTC)
  3. Teamcenter (UG)
  4. Agile(Oracle)
國內也有幾間在開發
  1. HyperPDM(大塚)
  2. urPDM(中衛)
  3. METIS(中國生產力)
Anyway, 上述幾種不做過多的優缺點評論(避免涉及攻擊)
而我們選用的產品是達梭的 SmarTeam,故以下會針對 SmarTeam 來做二次開發(客製化)的介紹,由於 PDM 是較封閉的圈圈,故會學習二次開發的表示對 PDM 有一定程式的瞭解,故不對 PDM 的操作方式多做介紹

程式語言
SmarTeam 二次開發的程式語言可分為兩種
  1. Script:採用的是 Smart Script,大致上與 VB Script 差不多
  2. .Net/COM:早期版本支援 VB6,後來的版本支援 .Net,但皆需註冊成COM
若要執行 COM 則需透過 Script 來呼叫 COM 的方法

二次開發##CONTINUE##
SmarTeam 程式的開發可分種兩種
  1. 獨立運作程式:撰寫獨立的程式來與 SmarTeam 進行互動
  2. 事件觸發:透過 SmarTeam 事件的偵測或是按鈕/選單的驅動來觸發二次開發的程式
在此介紹的是透過 SmartTeam 軟體介面的操作產生的事件來觸發程式
SmarTeam 觸發程式的點稱為 Hook,可分為 Client Hook 及 Server Hook
  1. Client Hook:將程式安裝至 Client 並註冊成 COM,透過 Script 來呼叫 COM 中的方法
  2. Server Hook:程式毋需一一佈署在 Client 端,一樣須透過 Script 來呼叫 COM 中的方法
之前有介紹事件觸發的點有分為SmarTeam 事件的偵測及按鈕/選單的驅動
  1. SmarTeam 事件:SmarTeam 有開放許多事件來觸發程式,例如 Login/Logout、Check in/Check out...等事件,其程式可安排在事件的前後或取代原本的操作

    可觸發的事件依類別的不同而有所不同,例如有些類別沒有生命週期的機制,當然不會有 Check in/Check out 的事件

    下圖為可用的事件範例(SmarTeam R19版),可由 「開始 --> SMARTEAM --> Administrative Tools --> Admin Console」 開啟管理控制台

    再點選 「應用程式工具 --> Script Maintenance」 開啟 Script 維護工具


























  2. 按鈕/選單驅動:透過表單(Form)的按鈕來觸發或是將指令插入 SmarTeam 的下拉選單中下圖為按鈕的事件觸發範例,一樣先開啟 Admin Console

    再點選 「使用者界面管理--> Form Designer」 開啟表單維護工具(這裡不談表單如何設計)

    圖中 Button 掛載了 OnClick 事件去驅動 GetProjectData() 方法















    而 GetProjectData() 是來自一個 Script 檔案中的方法,點選OnClick事件即可開啟 Script 瀏覽器
    如下圖,透過 Script 瀏覽器即可選取 Script 檔中所撰寫的方法

2009年6月25日 星期四

為何需要 PDM/PLM

企業面臨的困境

1. 愈來愈短的時間
  • 開發時程愈來愈短
  • 產品生命週期愈來愈短
2. 愈來愈複雜的產品

3. 人才培育不易,知識傳承更難
  • 挖角、帶槍投靠、斷層
4. 未來企業的主要競爭優勢:知識密集

由於有上述幾點問題,故需要好好的保存知識
從產品的規劃、設計、採購、製造、銷售及服務等產品生命週期間所產生的知識皆能完整保存,故需一套
強大具彈性的系統來管理,PDM/PLM 系統就因應而生


































PDM存放的資訊





2009年6月23日 星期二

引言

自從換新工作後,已經很久沒有好好寫過幾隻程式了,跟之前專職 coding 的工作差異甚大

換了新工作,大部份的時間就用來規劃跟寫一些較冷門的客製程式,也就是說在一個既有的系統上再進行「二次開發」。

「二次開發」是大陸的用法,一般我們稱客製化(Customization)

換工作後的第一個專案就是進行 PDM/PLM 系統的客製化,PDM(Product Data Managemene) 主要是在管理研發資料,舉凡研發過程產生的設計文件、設計圖檔、測試文件及操作手冊等都算是研發資料,也都應該列管。

然而我問過許多做研發的朋友及同學,其中不乏大公司,大部份都不知道什麼是 PDM,PDM 的全盛期應在 2000 年 ~ 2005 年間,但沒想到居然還那麼多人沒聽過,看來 PDM 未曾有過真正的全盛期就已衰退了,所以市面上也幾乎沒有 PDM 安裝操作及二次開發的書籍

除了 PDM 的二次開發外,後來為了未來專案的規劃及執行,專案的主要目的是加快設計速度及提高設計正確性

所以在專案中預計建立知識庫、圖文管及部份自動繪圖的功能,知識庫及圖文管部份是選了 Sharepoint,所以後來就去學習了 Sharepoint 的客製開發,使用 Sharepoint 的人好像也不多,資源當然也...,有能力客製的當然就更少了,國內也有一兩本翻譯書

而自動繪圖部份當然就是寫在 CAD 軟體上,現在正準備開始學習 CAD 軟體的二次開發,使用的CAD 工具是 pro/e,話說 CAD 的二次開發就比較普遍了,書也有幾本,不過還是冷門

不知為什麼,換了新工作後,寫的全是冷門的程式,資源又少,所以未來打算將這些較冷門的知識整理一下,分享給所需的人們