자주 묻는 질문
이 컬렉션은 가장 자주 묻는 API 관련 질문에 대한 답변입니다.
- 이 오류 메시지를 받았습니다: "This add-on cannot be validated. Please contact the distributor. (이 애드온은 검증될 수 없습니다. 배포자에게 연락 주시기 바랍니다.)" 무엇이 문제죠?
- 애드온에 사용될 템플릿 라이브러리 파트를 어떻게 만드나요?
- ArchiCAD 8에서 연관 치수를 어떻게 만드나요?
- (Win 전용) 애드온이 제 개발 머신에서는 완벽하게 실행되지만, 데모 머신에 설치하면 로드되지 않습니다.
- 일반 API DevKit의 서비스들을 이용하는 GDL 애드온을 컴파일할 수 있나요?
- 어떻게 알림을 즉시 캐치할 수 있나요?
- 3.1 DevKit에서 GRC 파일 안에 아이콘을 정의했습니다. 하지만 새로운 DevKit에서는 보이지 않습니다. 리소스 변환 오류도 발생했습니다. 또, 리소스에서 3개의 숫자들은 무엇을 의미하나요?
- 애드온으로 라이브러리 파트를 만드는 중입니다. 또 미리보기 그림도 넣었는데 보이지 않습니다.
- 간단한 팝업 메뉴와 같은 커스텀 제어에 대한 기본 콜백이 있나요?
- (Win 전용) 애드온을 링크할 때, 다음 경고를 받았습니다: "
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
" - 긴 프로세스 실행 중에 어떻게 진행 창을 열 수 있나요?
- 배치된 객체/창/문의 추가적인 파라미터 값들을 조절하는 함수를 갖고 있습니다. ArchiCAD 7에서는 잘 작동하나 ArchiCAD 8 혹은 9에서는 안 됩니다.
- 한 요소에 대한 3D 데이터를 읽을 때, 올바른 3D-vertex 월드 좌표를 얻을 수 없습니다. 그것들은 그 요소에 대한 로컬 좌표입니다. 그렇다면 한 요소의 월드 좌표에서 올바른 vertext 정보를 어떻게 검색할 수 있나요?
- 요소들을 DWG 파일로 내보내는 표준 DXF/DWG 애드온을 어떻게 만들 수 있나요?
- .grc 파일에서 User Controls가 요구하는 포맷이 무엇인가요?
-
이 오류 메시지를 받았습니다: "This add-on cannot be validated. Please contact the distributor. (이 애드온은 검증될 수 없습니다. 배포자에게 연락 주시기 바랍니다.)" 무엇이 문제죠?
여러 가지 문제들이 이 메시지를 도출할 수 있습니다:
- 애드온이 로드될 수 없습니다. 왜냐하면 dll/shared 라이브러리가 로드될 수 없기 때문입니다. 이것은 보통 라이브러리를 찾을 수 없거나 일부 초기화 실패인 경우에 발생합니다. 첫째 문제의 경우 Windows에서는 Depends.exe 애플리케이션으로 찾을 수 있습니다. (MS tool suite의 일부입니다) Mactel에서는 'otool -L' 터미널 커맨드가 애드온이 참조한 프레임워크들을 나열합니다. 둘째 문제의 경우 보통 애드온의 코드 안에 있습니다. :))
- 애드온은 서버 애플리케이션이 요구하는 DevKit으로 컴파일되지 않았습니다.
- 애드온은 'MDID' 리소스를 가지고 있지 않거나 'MDID' 리소스가 유효한 정보를 갖고 있지 않습니다. 이것은 다음에 의해 발생할 수 있습니다:
- Mac: 인터넷 통한 파일 시스템을 통한 유효한 전송이 없기 때문에 애드온이 리소스 Fork를 갖고 있지 않습니다.
- MDID 리소스가 애드온으로 컴파일되지 않았습니다.
- MDID 리소스가 데모 ID들을 갖고 있습니다. (예. 개발자 ID는 1, 로컬 ID는 1)
- MDID가 다른 애드온의 MDID와 충돌합니다; 이 경우 ArchiCAD는 동일한 MDID를 갖는 애드온들을 모두 로드하지 않습니다.
- 개발자 ID 또는 인증 코드에 오타가 있습니다. 이 경우 생성된 로컬 ID가 유효해 보이지만, ArchiCAD는 여전히 애드온 로드를 거부합니다. ID와 코드를 Graphisoft와 함께 더블-체크하십시오.
-
애드온에 사용될 템플릿 라이브러리 파트를 어떻게 만드나요?
여기에서 대답을 찾을 수 있습니다.
-
Automatic Dimensioning 애드온의 예제가 old neig ID들을
API_Base
의 새로운bool
필드들로 변환하는 방법을 보여줍니다:bool NeigID2Line (API_NeigID neigID) { return (neigID == APINeig_WallOn || neigID == APINeig_WallPlOn || neigID == APINeig_WallPlOnClOff || neigID == APINeig_BeamOn || neigID == APINeig_CeilOn || neigID == APINeig_RoofOn || neigID == APINeig_MeshOn || neigID == APINeig_HatchOn || neigID == APINeig_LineOn || neigID == APINeig_ArcOn || neigID == APINeig_SplineOn); } bool NeigID2Special (API_NeigID neigID) { return (neigID == APINeig_WallPl || neigID == APINeig_WallPlOn || neigID == APINeig_WallPlClOff || neigID == APINeig_WallPlOnClOff || neigID == APINeig_BeamHole || neigID == APINeig_WindHole || neigID == APINeig_DoorHole || neigID == APINeig_MeshRidge || neigID == APINeig_MeshRidgeOn); } static void MakeDimelemForWD (API_DimElem* dimelem, const MyCoord& mc) { WallRef wr; Int32 i; for (i = 1; i <= mc.wrs.Count (); i++) { wr = mc.wrs[i]; if (wr.openingpt != NOOPENINGPT) { dimelem->base.base.typeID = (wr.iswindow ? API_WindowID : API_DoorID); dimelem->base.base.special = NeigID2Special (wr.neigID); dimelem->base.base.line = NeigID2Line (wr.neigID); dimelem->base.base.guid = wr.guid; switch (wr.openingpt) { case OPENINGPT0: dimelem->base.base.inIndex = wr.inIndex; break; case OPENINGPT1: dimelem->base.base.inIndex = wr.inIndex; break; default: dimelem->base.base.inIndex = 4; // center break; } return; } } // 만약 여기 오게 되면 오류... return; }
-
(Win 전용) 애드온이 제 개발 머신에서는 완벽하게 실행되지만, 데모 머신에 설치하면 로드되지 않습니다.
이것은 보통 다음 이유들 중 하나로 인해 발생합니다:
- Visual Studio는 WINNT\System32 폴더에 자신만의 런타임 라이브러리들을 설치합니다. (MSVCxx.DLL와 MSVCPxx.DLL)
그리고 APX는 보통 이것들에게 동적으로 링크됩니다. 예를 들면, 그것은 DLL 파일들이 거기에 있을 거라고 예상합니다.
Visual Studio를 설치하지 않은 시스템이라면, DLL 파일들이 거기에 있지 않습니다.
당신은 Visual Studio를 설치했던 머신과 동일한 곳에 해당 파일들을 복사하여 이 문제를 해결할 수 있습니다.
참고: ArchiCAD는 그 파일들이 없다면 필요한 런타임 라이브러리들을 설치합니다. - 당신은 데모 머신에 애드온의 디버그 버전을 설치했을 것입니다. 이것은 작동하지 않습니다. 왜냐하면 그것이 데모 머신에 존재하지 않는 Visual Studio의 디버그 라이브러리에 링크되었기 때문입니다. 대신 릴리즈 버전으로 컴파일하십시오.
- Visual Studio는 WINNT\System32 폴더에 자신만의 런타임 라이브러리들을 설치합니다. (MSVCxx.DLL와 MSVCPxx.DLL)
그리고 APX는 보통 이것들에게 동적으로 링크됩니다. 예를 들면, 그것은 DLL 파일들이 거기에 있을 거라고 예상합니다.
Visual Studio를 설치하지 않은 시스템이라면, DLL 파일들이 거기에 있지 않습니다.
당신은 Visual Studio를 설치했던 머신과 동일한 곳에 해당 파일들을 복사하여 이 문제를 해결할 수 있습니다.
-
일반 API DevKit의 서비스들을 이용하는 GDL 애드온을 컴파일할 수 있나요?
아니오. GDL 애드온들은 자체 API 환경을 이용하며, 이것은 일반 API 실행 환경과 상당히 심하게 혼합됩니다.
-
당신의
CheckEnvironment ()
함수로부터APIAddon_Preload
를 리턴합니다. 이것은 사용자가 어떤 액션을 수행하지 않더라도Registerface ()
가 호출된 후에 당신의Initialize ()
함수가 즉시 호출되도록 해줍니다. 그리고 나서 당신은Initialize ()
로부터 알림 콜백 함수(들)을 안전하게 설치할 수 있습니다. -
3.1 DevKit에서 GRC 파일 안에 아이콘을 정의했습니다. 하지만 새로운 DevKit에서는 보이지 않습니다. 리소스 변환 오류도 발생했습니다. 또, 리소스에서 3개의 숫자들은 무엇을 의미하나요?
'GICN' 32501 "General Settings" { 0 128 128 }
'0 128 128'는 아이콘 내 투명 영역의 R/G/B 컬러입니다; 각 컴포넌트의 범위는 0-255입니다. DevKit 6.1에서 컴파일하지 않는 이유는 일부 컬러들(Black과 White)이 아이콘의 컬러 테이블 내부의 고정된 위치에 있어야 하기 때문이다: Black은 첫 번째 컬러이어야 하고, White는 마지막 컬러이어야 한다. 아이콘들은 32-비트 깊이로 변환된다는 것을 참고하십시오. 그래서 당신은 임의의 큰 사이즈를 사용할 수 없습니다.
-
애드온으로 라이브러리 파트를 만드는 중입니다. 또 미리보기 그림도 넣었는데 보이지 않습니다.
ArchiCAD 8부터 당신은 미리보기 그림의 MIME 타입을 (
0
으로 끝나는) C 문자열로 미리보기 그림이 들어 있는 데이터 핸들의 시작에 추가해야 합니다. (예. PNG 이미지에 대해서 "image/png\0") -
간단한 팝업 메뉴와 같은 커스텀 제어에 대한 기본 콜백이 있나요?
아니오. 당신은 리소스 파일로부터 데이터를 로드하는 당신만의 콜백을 작성하고 그것을
UC257SetData
와 함꼐 사용자 컨트롤로 넘겨줘야 합니다. 또한 당신은UC257SetType
을 호출해야 합니다. 그리고 어쩌면UC257SetStyle
을 호출해야 합니다. 이제 DG_Test 예제가 이 함수들로 당신이 어떻게 작업해야 하는지 보여줍니다. -
(Win 전용) 애드온을 링크할 때, 다음 경고를 받았습니다:
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
이것은 단지 당신이 당신의 애드온의 디버그 버전을 컴파일하고 있는 반면, (그러므로 런타임 DLL의 디버그 버전과 링크됨) DevKit과 함께 동봉된 라이브러리는 릴리스 버전입니다. (런타임 DLL의 릴리즈 버전과 링크됨) 이것은 어떤 문제도 일으키지 않습니다.
-
긴 프로세스 실행 중에 어떻게 진행 창을 열 수 있나요?
여러 가지 방법이 있습니다:
- API가 제공하는 ACAPI_Interface 함수들 (APIIo_InitProcessWindowID, 등) 집합을 사용합니다. 이것은 작은 문제를 가지고 있습니다: ArchiCAD 내의 다른 프로세스들은 동일한 진행 창을 사용하고 있습니다. 그리고 애드온이 표시한 정보를 방해할 수 있습니다.
- 당신만의 모델리스 팔레트를 진행 창으로 사용합니다.
- 모달 다이얼로그를 열고 거기서 프로세스를 구동합니다.
DevKit v4.1부터 모달 다이얼로그가 화면에 보이고 있다 하더라도 당신은 데이터베이스를 전환할 수 있습니다.
DG_Test 예제에서
Do_ProgressWindow
함수를 보십시오. 이것은 현재 권장하는 해결책입니다.
-
배치된 객체/창/문의 추가적인 파라미터 값들을 조절하는 함수를 갖고 있습니다. ArchiCAD 7에서는 잘 작동하나 ArchiCAD 8 혹은 9에서는 안 됩니다.
이 문제는 일반적으로 인덱스 별로 추가 파라미터를 참조할 때 발생합니다:
(*memo.params)[27].value.real = 7.25;
문제는 서브타입 계층에서 비롯됩니다: 계층의 객체/창/문은 그 조상들의 모든 파라미터들을 상속합니다. 따라서 인덱스 대신 이름으로 파라미터를 참조해야 합니다. 이것은 또한 그 값을 수정하기 전에 이름별로 파라미터를 찾아봐야 한다는 것을 의미합니다:
static void SetParValue (API_AddParType *** addPars, const char * name, const double &val) { if (addPars == NULL || *addPars == NULL) return; Int32 ii, addParNum = BMGetHandleSize (reinterpret_cast<GSHandle> (*addPars)) / sizeof (API_AddParType); for (ii = 0; ii < addParNum; ii++) { if (CHCompareCStrings ((**addPars)[ii].name, name, CS_CaseInsensitive) == 0) { (**addPars)[ii].value.real = val; break; } } return; } // SetParValue
-
한 요소에 대한 3D 데이터를 읽을 때, 올바른 3D-vertex 월드 좌표를 얻을 수 없습니다. 그것들은 그 요소에 대한 로컬 좌표입니다. 그렇다면 한 요소의 월드 좌표에서 올바른 vertext 정보를 어떻게 검색할 수 있나요?
각 3D body에는 vertex(정점)의 좌표에 적용되어야 하는 변환 행렬(API_BodyType 참조)이 포함되어 있습니다. 이것은 우리가 몇 가지 인스턴스들을 매우 컴팩트하게 가지고 있는 바디를 저장할 수 있게 해준다. (예. vertex들을 한 번만 저장하고 모든 인스턴스에 대해 다른 변환 행렬을 가지고 있습니다)
-
요소들을 DWG 파일로 내보내는 표준 DXF/DWG 애드온을 어떻게 만들 수 있나요?
당신은 ACAPI_Command_Call 함수의 설명에서 간단한 예제를 찾아보실 수 있습니다.
-
.grc 파일에서 User Controls가 요구하는 포맷이 무엇인가요?
자세한 설명은 여기 있습니다.