기본 콘텐츠로 건너뛰기

라벨이 PDS인 게시물 표시

Microstation J와 file size 32MB

Microstation J까지의 버전에서 DGN file이 32MB가 넘어가면 문제가 발생한다고 합니다. 주의하세요!!! mdlSystem_compressDgnFile 함수를 호출하면 Undo같은 기능을 위해 저장하고 있는 내용을 지워 파일 크기를 줄일 수가 있습니다. J가 워낙 오래된 프로그램이라 파일 크기 제한은 현재 상황과 맞지 않습니다. PDS 사용자들은 어쩔수 없이 사용할수 밖에 없구요.

Nozzle Data dump

이 글은 Microstation에 관련되기 보다는 PDS에 관련된 글입니다. 제가 참여한 PlantWAVE에서는 nozzle data를 database에서 구해와 도면에 뿌려주게 됩니다. 모델러들이 nozzle을 모델링을 하게 된다면 nozzle에 대한 정보가 파일에만 저장이 되고, database에는 저장이 되지 않습니다. 그래서 부득이하게 PlantWAVE에서 nozzle data를 뿌려주기 위해서는 PDSShell을 실행 한후에 Load Design Database를 실행해 주어야 합니다.

PDS NOZZLE DATA 분석 V7 / MSTN/MDL/VBA

PDS에서 Nozzle은 Cell형식으로 만들어져 있습니다. Nozzle을 찾기 위해서 이 Cell들 중에서 drms linkage의 user id가 22인 Cell을 찾습니다. 일단 이 Cell을 Nozzle로 간주할 수 있습니다. 다음 attribute linkage는 Nozzle이 속한 Equipment의 관한 dmrs linkage입니다. 또 다음의 attribute linkage는 그냥 무시합니다. 그 다음에 나타나는 attribute는 user data linkage로써 nozzle의 이름을 가지고 있습니다. 이 user data linkage의 data 부분에서 첫 10 바이트를 nozzle 이름으로 구하면 됩니다. 또한 Nozzle의 여러 정보들은 Database의 22 , 23번 테이블에 담겨져 있습니다. partition no와 nozzle의 occurrence number로 nozzle의 정보를 구할 수 있습니다.

62 Element 분석

62 Element는 일반적인 MSTN Element가 아닌 PDS용 특수 Element라 할수 있습니다. 특히 Equipment의 이름을 저장하는 Element이다. 이 Element에 대한 포맷은 문서화 되지 않았는데, 여기서 바이러니 분석을 통해 알아본 포맷을 적어보고자 합니다. 62 Element 역시 MSTN의 모든 Element가 가지는 헤더부분을 가지고 있습니다. 가장 중요한 Equipment Name을 저장하는 위치는 Element 시작 위치에서 18Words 떨어진 부분에서 30 Bytes 의 공간을 차지하고 그 다음으로 descr1 , descr2가 각각 40 , 48Bytes 차지합니다. 마지막으로 98 Words 떨어진 곳에 Equipment의 occurno가 위치합니다. 아래는 62 Element를 삽입하는 예제 코드입니다. LinkageHeader tLinkHdr; int nStatus; MSElement object; //---------------------------------------------------------------------------------------------------------------------- // put equipment name element memset(object , '\0' , sizeof(MSElement)); object.hdr.ehdr.type = 62; //! 0x3E object.hdr.ehdr.words = 98; //! 0x62 object.hdr.ehdr.xhigh = 0xffffffff; object.hdr.ehdr.yhigh = 0xffffffff; object.hdr.ehdr.zhigh = 0xffffffff; object.hdr.dhdr.attindx= 0x0050; object.hdr.dhdr.props.b.a = 1; //! always new bit is setted. memset((object.buf[18]) ...

PDS 3D 모델을 이용해서 2D 도면 생성 로직 V7 / MSTN/MDL/VBA

PDS 3D 모델을 이용해서 2D 도면 생성 로직을 간단하게 FLOW CHART형식으로 표현해 보았습니다. 여기서 2D DWG FILE NAME은 PDS에서 작성한 HIDDEN 도면을 말하는 겁니다. 그리고 121,122,123,113은 PDS에서 사용하는 테이블 이름을 의미합니다.

VB를 통한 FrameWork 자동 로드

FrameWork을 자동으로 로딩하는 것에 대해 알아봅시다. 물론 PC에 FrameWork이 설치되어 있어야 하겠지요. 현재 디렉토리를 Microstation이 설치되어 있는 디렉토리로 설정합니다.(SetCurrentDirectory) Shell을 이용해서 mod 폴더에 있는 FrameWork dgn 파일을 오픈합니다. Set msApp = GetObject("" , "Microstation.Application") fwstart.ma 파일을 로드합니다. msApp.MbeSendCommand("MDL LOAD FWSTART.MA") 다시 시간이 걸립니다. 이렇게 하면 성공적으로 FRAMEWORK을 로드할수 있습니다. 한가지 주의할 사항은 위의 절차대로 하기 전에 반드시 MS , FW_PRODUCT 이 두 환경변수를 설정해 줘야 한다는 겁니다. 예) "FW_PRODUCT"="C:\\WIN32APP\\INGR\\FWPLUS\\" "MS"="C:\\Bentley\\Program\\MicroStation\\ustation.exe"

3D 모델링 상의 한 점과 2D 도면(뷰)과의 상호 변환

 우선 3D 모델링 상의 한 점에서 2D 도면(뷰)으로의 변환을 살펴봅시다.  일반적으로 3D 모델링을 바라보는 방향에 따라서 TOP , BOTTOM , LEFT , RIGHT , FRONT , BACK 이렇게 6개의 뷰를 생성할 수 있습니다. 아래는 각각의 뷰 변환행렬입니다. $$\begin{eqnarray}\text{Bottom View} &=&  \begin{bmatrix}1&0&0\\0&-1&0\\0&0&1\end{bmatrix} \\ \text{Top View} &=&  \begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix} \\ \text{Right View} &=&  \begin{bmatrix}1&0&0\\0&0&1\\1&0&0\end{bmatrix} \\ \text{Left View} &=&  \begin{bmatrix}0&-1&0\\0&0&1\\-1&0&0\end{bmatrix} \end{eqnarray}$$ 그리고 3D 모델링에 스케일과 회전을 적용한 후에 3D 모델의 중점을 도면의 중점에 맞추면 도면으로의 변환이 완성됩니다. 변환할 점에서 모델의 중점을 뺀다.(모델의 중점을 (0 , 0 , 0)좌표로 두는 효과) $tmp=pt-\text{model center pt}$ 뷰 변환 행렬을 통해 2D로 변환시킨다. $tmp^\text{'}= \begin{bmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{bmatrix}*tmp$ 변환된 2D 좌표를 뷰 회전 각도로 회전시킨...