기본 콘텐츠로 건너뛰기

9월, 2010의 게시물 표시

Element Descriptors

이 부분은 본래 MDL Programming하기 전에 반드시 알아야만 하는 부분입니다.(뒷늦게 올리게 되었네요) 프로그래밍에서 주로 하는 일은 Element들을 다루는 일일 것입니다. 따라서 이 Element들이 어떻게 저장되어 있는지를 꼭 알아야만 합니다. (ARX를 시작하기 전에 AutoCAD Element들이 어떻게 저장되어 있는지 알아야만 하는 것 처럼..) 아래는 msElementDescr구조체의 구조와 샘플 이미지 입니다. structmsElementDescr /* defined in mselems.h*/ { struct { structMSElementDescr*next; /* ptrto first entry in list */ structMSElementDescr*previous; /* ptrto last entry in list */ structMSElementDescr*myHeader; /* ptrto my hdr*/ structMSElementDescr*firstElem; /* ptrto first elemif header*/ DgnModelRefP *dgnModelRef; /* valid only if from cache */ ElementRef *elementRef; /* valid only if from cache */ Int32 isHeader; /* is this a complex header */ Int32 isValid; /* INTERNAL USE ONLY */ Int32 userData1; /* available for user */ Int32

Background mode로 실행하기

ARX에서도 AutoCAD application을 활성화(?)시키지 않고 작업을 수행할수 있듯이, MDL 프로그래밍에서 그렇게 유사하게 작업을 수행할수 있습니다. application이 Background mode로 실행되고 있는지 여부는 Entry point 함수의 두번째 인자를 검사함으로써 알수 있습니다. 두 번째 인자가 " MS_INITAPPS " 이면 Background mode로 실행되고 있는 것입니다. 그럼 어떻게 Background mode로 application을 실행시킬수 있을까요? -waoption을 사용해서 application을 Background mode로 실행시킬수 있습니다. 예를 들면, "C:\Program Files\Bentley\MicroStation\ustation.exe" -waSample7.ma 여기서 Sample7.ma가 Background로 실행시키고자 하는 application 이름입니다.

XM MDL Programming - #5(Element 생성하기)

이번에는 간단히 예제로 Line과 Text를 생성하는 방법에 대해 알아보도록 합시다. 다른 Element들에 대해서는 생성하는 함수만 알면 아래의 루틴대로 하면 아무 어려움 없이 원하는 Element들을 생성할수 있습니다. 루틴이라고 해봤자 생성하는 함수로 원하는 Element를 생성한 후에 Property를 설정하고 add하는 것 밖에 없습니다. 우선 간단한 다이얼로를 만든 뒤에 생성할 Element의 Type을 설정하는 ComboBox를 추가합니다. 그리고 Place 버튼을 누르면 Element를 생성하는 것으로 하죠. 자 그럼 Place 버튼의 Callback 함수를 보도록 하죠. void CModelessDlg::OnBnClickedBtnPlace() { CMStationDialog::UpdateData(TRUE); startElementPlacement(this); } 아래 startElementPlacement 함수를 호출합니다. void startElementPlacement(CModelessDlg* pDlg) { g_pDlg = pDlg; CString csElement; int nIndex = g_pDlg->m_cbCtrlElemType.GetCurSel(); if(nIndex != -1) { g_pDlg->m_cbCtrlElemType.GetLBText(nIndex,csElement); if(csElement.CompareNoCase("Line") == 0) { startLinePlacement(); } else if(csElement.CompareNoCase("Text") == 0) { mdlState_setFunction (STATE_DATAPOINT, placeText);

Element 탐색하기

이번에는 dgn 파일에 있는 element들을 찾는 방법을 알아보도록 합시다. 먼저 간단한 코드를 먼저 보시죠. int ScanFile(UShort* typeMask , constintmaskSize) { intstatus = 0; intnElemCnt = 0; intnElemType; ULong elemAddr[50]; ScanCriteria* pScanCrit = NULL; UShort usTypeMask[8]; MSElement element; // Initialize the scan criteria pScanCrit = mdlScanCriteria_create(); mdlScanCriteria_setReturnType(pScanCrit, MSSCANCRIT_RETURN_FILEPOS, FALSE, FALSE); memset(usTypeMask, 0, sizeof(usTypeMask)); mdlScanCriteria_setElementTypeTest(pScanCrit , typeMask , maskSize); mdlScanCriteria_setModel (pScanCrit,mdlModelRef_getActive()); mdlScanCriteria_setElementCategory (pScanCrit,ELEMENT_CATEGORY_GRAPHICS); do { intscanWords = sizeof(elemAddr) / sizeof(short); status = mdlScanCriteria_scan(pScanCrit, elemAddr, &scanWords, NULL); if( status == BAD_FILE || status == BAD_ELEMENT ) break; intnumAddr = scanWords / sizeof(short); for(int i=

XM MDL Programming - #3(Command 사용하기)

이번에는 Command를 사용하는 방법에 대해서 알아보도록 하죠. 일단 먼저 MSTN의 리소스 파일을 이용하여 Command 구조를 선언합니다. 이것을 컴파일하면 .ma 파일이 생성됩니다. CT_BASIC이 최상위 Command Table 이름이고, CT_DELETE라는 하위 Command Table을 필요(REQ)로 합니다. CT_DELETE라는 Table은 CT_BASICAPP에서 상속(INHERIT)을 받고 더 이상의 하위 Command Table은 필요로 하지 않습니다. .mke 파일을 잠깐 살펴보면... # Create needed output directories if they don't exist $(rscOutDir)$(tstdir) : $(rscOutDir)$(tstdir) $(maOutDir)$(tstdir) : $(maOutDir)$(tstdir) rscCompIncs + -i$(hdrOutDir) -i$(baseDir)inc/ appRscs = $(rscOutDir)$(appName).rsc $(incDir)$(appName)Cmd.h : $(rsrcInc)$(appName)Cmd.r $(rscOutDir)$(appName)Cmd.rsc : $(rsrcInc)$(appName)Cmd.r $(rscOutDir)$(appName).rsc : $(rsrcInc)$(appName).r rscLinkObjs = $(rscOutDir)$(appName).rsc\ $(rscOutDir)$(appName)Cmd.rsc 여기서 배경이 노란줄을 주의해서 살펴볼 필요가 있습니다. Command를 정보를 가지고 있는 리소스 파일에서 *.h 파일을 생성시키는 부분입니다. 이 *.h 파일은 아래에서 사용할 Command Number를 가지고 있습니다. #define CMD_MYDELETE 0x01000000 /* MANIPULATION */ #defin

Component 선택하기

Component 선택 페이지를 삽입하기 위해서 아래 매크로를 입력합니다. ; Component를 선택할 수 있도록 한다. Page Components 이렇게 하면 Section들의 이름이 모두 Component 페이지에 표시가 되구요. 기본값으로 선택이 되어 있습니다. NSIS는 선택된 Section만을 설치를 하게 되는데요. 프로그램에서 꼭 설치를 해야만 하는 필수 요소들이 있는데요. 이것들을 사용자들이 선택해제 하지 못하도록 Read-Only로 나타내야할 필요가 있습니다. 그럴경우 Section 안에 아래와 같은 코드를 입력하면 됩니다. SectionIn RO Section "DLL" SEC02 SectionIn RO SetOutPath "$INSTDIR" File "AutoUp.dll" File "IsGUI2008.dll" File "IsUtil2008.dll" File "log4cxx.dll" File "cximagecrt.dll" File "GdiPlus.dll" File "mfc90.dll" File "msado15.dll" File "msvcp90.dll" File "msvcr90.dll" File "msvcrt.dll" File "python26.dll" File "pythoncom26.dll" File "pywintypes26.dll" File "WinGraphviz.dll" File "Zip.dll" File "Zlib1.dll" ;File "CrashRpt.dll" SectionEnd 앞서도 얘기 했지만 Componen