기본 콘텐츠로 건너뛰기

11월, 2010의 게시물 표시

3D 평면 상의 점들을 2D로 변환

3D 평면상의 점들을 2D로 변환하는 방법에 대해서 알아보도록 하자. 지금 개발하고 있는 2D상의 점들을 삼각화 시키는 루틴이 있는데 이 루틴을 3D 평면상의 점들에 대해서 적용시키기 위해서 3D 평면상의 점들을 2D로 변환시키는 방법이 필요하다. 고찰 1) 3D 평면을 X-Y 평면으로 맞추는 것이다. 3D 평면의 법선 벡터(n)를 Z축과 일치시키기 위해서 X,Y 축 방향으로 회전시키는 방법이다. 이 방법에 대해서는 이전 글 을 참조 하면 될것 같다. 고찰 2) 이 글에서 주로 생각해 볼것은 실제로 평면을 회전시키지 않고 2D 상으로 변환시키는 방법이다. 앞서 이야기 했듯이 이미 평면의 법선 벡터(n)를 알고 있으므로, 평면상의 임의의 점(P)을 하나 선택하고 그리고 다른 또 하나의 점을 선택한다. 그럼 하나의 벡터(u)를 구할 수 있고 이 벡터와 평면의 법선 벡터와의 외적을 통해 구한 벡터와 평면상에서 수직인 또 다른 벡터(v)를 구할 수 있다. 여기서 구한 평면상의 두 벡터(u,v)를 축으로 하여 평면상의 모든 점들을 u,v축에 대한 값으로 표현할 수 있다. 이렇게 해서 $t_2$의 값을 구할 수 있고, 마찬가지로 $t_1$의 값을 구할 수 있다. 결론적으로 모든 점들에 대하여 u,v 축에 대한 값을 구할수 있으므로 2D로 변환한 것이 된다. 고찰 2)가 고찰 1)보다 나은 점은 고찰 1)에서는 실제적으로 몇 단계의 계산을 거쳐 2D 상의 점으로 변환시킨다는 것이다. 이때 아무래도 시간과 floating point연산으로 인한 데이터 변형이 일어날수 있다는 것이다. 이에 비해 고찰 2)는 변화 루틴이 간단하다.

entity 색상 설정하기

gp_Circ gpCircle ; gpCircle . SetLocation ( center ) ; gpCircle . SetRadius ( dRadius ) ; Handle ( Geom_Circle ) aCircle = :: new Geom_Circle ( gpCircle ) ; Handle ( AIS_Circle ) hCircle = :: new AIS_Circle ( aCircle ) ; //! set red color7 Quantity_Color color(1.0, 0.0, 0.0, Quantity_TOC_RGB); m_pAISContext - > SetColor ( hCircle , color ) ; m_pAISContext - > Display ( hCircle , true ) ; 2011.08.25; m_pAISContext->Display 함수를 호출하면 화면이 바로 갱신되는 문제(?)가 있습니다. 이 문제를 피하고 싶으면 AIS 객체의 색상의 설정해 주면 됩니다. Handle ( AIS_Circle ) hCircle = :: new AIS_Circle ( aCircle ) ; Quantity_Color aColor ( 1.0 , 0.0 , 0.0 , Quantity_TOC_RGB ) ; hCircle - > SetColor ( aColor ) ;

Circle 그리기

gp_Circ gpCircle ; gpCircle . SetLocation ( center ) ; gpCircle . SetRadius ( dRadius ) ; Handle ( Geom_Circle ) aCircle = new Geom_Circle ( gpCircle ) ; Handle ( AIS_Circle ) hCircle = new AIS_Circle ( aCircle ) ; m_pAISContext - > Display ( hCircle , true ) ; Handle(Geom_Circle) aCircle = new Geom_Circle(gpCircle); 로 생성했는데 이를 해제하지 않아서 영~~ 찝찝하네요... 2011.08.25; 메모리 관리는 OCC에서 하는 것으로 보입니다.

Constants

4.2.3 Constants Constants can also be used in the InstallDirattribute. Note that some of the new constants will not work on every OS. For example, \$CDBURN_AREA will only work on Windows XP and above. If it's used on Windows 98, it'll be empty. Unless mentioned otherwise, a constant should be available on every OS. \$PROGRAMFILES , \$PROGRAMFILES32 , \$PROGRAMFILES64 The program files directory (usually C:\Program Filesbut detected at runtime). On Windows x64, \$PROGRAMFILES and \$PROGRAMFILES32 point to C:\Program Files (x86) while \$PROGRAMFILES64 points to C:\Program Files. Use \$PROGRAMFILES64 when installing x64 applications. \$COMMONFILES, \$COMMONFILES32, \$COMMONFILES64 The common files directory. This is a directory for components that are shared across applications (usually C:\Program Files\Common Filesbut detected at runtime). On Windows x64, \$COMMONFILES and \$COMMONFILES32 point to C:\Program Files (x86)\Common Files while \$COMMONFILES64 points t

UserType.dat 사용하기

OpenCasCade 배포판에서 UserType.dat 파일도 함께 배포하고 있습니다. (배포판 설치 폴더의 Tools 폴더 안에 보면 UserType.dat 파일이 있습니다.) 다들 아시다시피 이것을 사용하면 사용자 정의 Type도 highlighting할수 있습니다. 이 UserType.dat 파일을 예를 들면 C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE 폴더에 복사해 두면 OCC관련 Type들이 highlighting됩니다. 1 2 3 4 5 6 7 8 9 10 void  C3DWnd::DisplayAxis() {     CLibMesh2dTestCaseView *  pView  =  (CLibMesh2dTestCaseView * )GetParent();     CLibMesh2dTestCaseDoc *  pDoc  =  (CLibMesh2dTestCaseDoc * )pView - > GetDocument();       Handle(AIS_Trihedron) aTrihedron;     Handle(Geom_Axis2Placement) anAxis  =   new  Geom_Axis2Placement(gp::XOY());     aTrihedron  =   new  AIS_Trihedron(anAxis);     pDoc - > m_pAISContext - > Display(aTrihedron); } Colored by Color Scripter cs

Dgn writer for MSTN J

간단한 dgn writer module 을 공개합니다. 첨부한 pdf 파일 형식으로 작성한 텍스트 파일을 읽어 들여 dgn 파일에 쓰는 모듈입니다. 간단한 MSTN element 정도는 지원하고요 property들도 지정이 가능합니다. 예제 텍스트 파일 을 첨부합니다. 관심있으신 분들은 한번 사용해 보시고요 버그나 추가 하고픈 element가 있으면 연락주세요. 사용법은 아래 이미지를 보시면 알수가 있습니다.

Create DONUT like AutoCAD's donut

AutoCAD에서의 Donut과 유사하게 MSTN J에서 Donut을 만드는 함수입니다. 함수 분석은 그리 어렵지 않구요. 간단히 설명하자면 두개의 Ellipse를 생성한 다음에 큰 Ellipse에서 작은 Ellipse을 뺀 나머지 부분을 생성한 후 저장하면 됩니다. //! get difference pattern between two patterns mdlElmdscr_differenceShapes(&patternEdPP, NULL, OutpatternEdPP, InpatternEdPP , 0); 자 그럼 코드를 볼까요... /** @brief create donut @author HumKyung.Baek @date ????.??.?? @return boolean */ Private boolean Draw_Donut(floatfInsideDia, floatfOutsideDia, Dpoint3d *ptCenter, intnColor, intnLayer) { MSElementUnion newElement, newInElement, newOutElement; inti, stat; intnFillmode = 1; intnWeight, nStyle; MSElementDescr *OutpatternEdPP = NULL, *InpatternEdPP = NULL, *patternEdPP = NULL; doubleunitVal = tcb->uorpersub; ptCenter->x = ptCenter->x * unitVal; ptCenter->y = ptCenter->y * unitVal; ptCenter->z = ptCenter->z * unitVal; stat = mdlEllipse_create(&newOutElement, NULL, ptCenter, fOutsideDia*unitVal, fOutsideDia*unitVal, NULL, nFillmode);

Fill이 보이지 않을때

분명히 Shape같은 element를 Fill했는데 화면에 보이지 않을 경우에 View Attribute를 살펴보세요

which one we should select as model reference origin while converting 3D to 2D

제목을 쓰다 보니 길어졌는데요, 간단히 말하자면 3D에서 2D로 변환시킬 때 3D의 기준 좌표로 어디를 선택하느냐는 것입니다. 지금 수행중인 도면 자동화 프로그램에서(PDS용) ISO 뷰에 대한 도면 작업을 하는 부분이 있습니다. 그래서 일반 뷰(TOP,BOTTOM,LEFT,RIGHT,FRONT,BACK)에서 처럼 3D 좌표를 2D로 좌표로 변환시키는 작업을 했습니다. 그런데 원하는 결과가 나타나지 않고 그 위치가 조금 어긋나 있는 것이었습니다. 반나절을 헤멘 결과 그 원인을 찾았는데, View Reference 좌표는 PDS Hidden Drawing에서 얻었고, Model Reference 는 좌표는 PDS Database에서 뷰의 모델 min,max에서 center를 구해서 model reference로 삼았습니다. 결과적으로 model reference에서 문제가 발생했습니다. 사실 PDS Hidden Drawing에도 reference origin이라는 항목이 있는데 이 값이 일반 뷰에서는 PDS Database에서 계산한 값과 일치했습니다. 그런데 ISO 뷰에서는 그 값이 일치하지 않더군요. 결론적으로 model reference 좌표는 PDS Hidden Drawing에서 구하는게 맞습니다.

DLL calling convention

오늘 조금 희한한 경우를 발견했습니다. 다름이 아니라 VC++ 아래와 같이 정의한 함수를 1 2 3 4 5 extern   "C"  DLL_EXPORT void  DGN2NSQ( const   char *  pExportFilePath, const   char *  pImportFilePath ,  const   char *  pIniFilePath ) { ... 생략 } Colored by Color Scripter cs VB에서 아래와 같이 선언한 뒤 VB CODE를 컴파일해도 아무런 에러를 발생시키지 않고 컴파일이 성공되었습니다. 매개 변수 하나를 선언하지 않았는데도 말이죠. 1 2 Declare  Sub  DGN2NSQ Lib  "IEManager.dll"  _ ( ByVal  ExportFilePath  As   String ,  ByVal  ImportFilePath  As   String ) cs VC++의 함수에서 디버깅을 해보면 제일 마지막의 값은 쓰레기 값이 넘어오는 것을 확인할 수 있었습니다. DLL함수 호출 규약을 __stdcall으로 바꾸어 테스트를 한번 해 보아야 겠습니다. - 결론 : VB는 똑똑하게(?) 인자 갯수를 다르게 선언하고 또 사용하고 해도 컴파일때 에러를 내지 않습니다. 뭐 이런게 다 있을까요?