기본 콘텐츠로 건너뛰기

라벨이 Arx인 게시물 표시

Why does AutoCAD insert my blocks in wrong scale?

인도 몇몇 직원들에게 PlantWAVE에 대해서 간단히 DEMO를 진행하던 도중에 KEY PLAN/NORTH MARK를 INSERT했는데, 프로그램에서 지정한 SCALE대로 insert가 되지 않아 한참을 당황했습니다. 다행이 직원의 도움을 받아 해결했습니다. 아래는 CAD Forum에 올라와 있는 내용입니다. Blocks and Xrefs contain their insertion unit settings, which are used for automatic scale conversion (rescale) when they are inserted/attached to a drawing using other units. These units are defined in the INSUNITS (default units), INSUNITSDEFSOURCE (source units) and INSUNITSDEFTARGET (target units) variables. In older AutoCAD versions, these variables were used only for the block inserts/drags from DesignCenter. AutoCAD 2006 (and higher) uses them for all methods of insertion of blocks, xrefs and images. If your blocks are inserted in an improper scale (e.g. scaling 0.254, 12, 10 or 1000), you have probably wrong (different) settings of your block insertion units. Set INSUNITS e.g. to 0 (unitless) - then both the INSUNITSDEFxxxx variables will apply - set them also to 0. Also make sure you are us...

CDocData

CDocData는 objectarx wizard로 프로젝트를 생성하면 자동으로 생성해주는 클래스입니다. 일반적으로 프로그래밍에서 Document에 연관된 데이터를 유지 관리하는데 사용합니다. 지금 진행중인 프로젝트에서 AutoCAD가 불규칙적으로 강제 종료가 되는 현상이 발견되고 있었습니다.(몇년전부터 쭉 진행중인 프로젝트라...) 도대체 아무리 코드를 뒤져봐도 그 원인을 파악할 수가 없었습니다. 이 프로젝트는 회사내부에서 사용하기 위해 진행중인 프로젝트라 이 문제를 눈감고 지나쳤습니다. 제가 만든 프로그램으로 사용자의 불만은 있었지만(프로그램이 불안정하다) 그럭저럭 2개의 프로젝트를 진행했습니다. 이 번에 다시 프로그램을 업데이트 할 일이 생겨서 지난번에 지나쳤던 문제를 해결하리라 마음먹고 이틀의 시간을 버그를 수정하는데 할애를 했습니다. ADSN의 글을 읽는동안 CDocData는 map에서 관리하고 있는데 이것은 내부적으로 STL의 Tree형식으로 데이트를 관리합니다. 그래서 Tree의 밸런스를 맞추기 위해 데이터를 복사를 해서 Tree의 균형을 맞춘다고 합니다. 그러니 CDocData는 복사 생성자를 지원했어야 했습니다. 저의 CDocData 클래스는 복사 생성자도 지원하지 않고 소멸자에서 열심히 메모리 할당한 멤버 변수들을 열심히 메모리 해제를 하고 있었습니다. 그러니 어떻게 되겠습니까? 최종적으로 Tree에 생기는 CDocData의 포인터 멤버변수는 쓰레기 값을 가리키게 되고 이것을 가져다 쓰는곳에서는 필연적으로 에러가 발생될것입니다. 위의 원인은 제가 C++ 프로그래밍을 할때 기본적으로 지켜야할 원칙을 지키지 않았기 때문에 발생한 문제입니다. 클래스에는 기본적으로 복사 생성자를 만들어 줘야 합니다. 그렇게 하고 싶지 않으면 복사생성자를 protected나 private으로 정의해서 원칙적으로 클래스 복사가 되는것을 막아줘야 합니다.