주 콘텐츠로 건너뛰기
프로젝트 설정 생성 편집

엔드포인트 직접 호출하기

전용 함수가 준비되어 있는 항목은 Node 1, 0, 0, 0 처럼 한 줄로 끝납니다. 하지만 CIVIL NX API의 엔드포인트는 수백 개이고, 전용 함수는 자주 쓰는 것들에만 붙어 있습니다. 이 글에서는 전용 함수가 없는 엔드포인트를 바디 조립 없이 다루는 방법을 살펴봅니다.

이 글에서 다루는 것

・ db 엔드포인트를 읽고 쓰는 함수

・ 번호를 자동으로 붙이기

・ 명령 실행하기

・ 어떤 엔드포인트든 보내는 ApiSend

・ 바디를 그대로 보내야 할 때

DbReadAll(uri)

DbReadOne(uri, id)

DbItems(uri)

DbItem(uri, id)

DbCreate(uri, items)

DbCreateOne(uri, id, fields)

DbUpdate(uri, items)

DbUpdateOne(uri, id, fields)

DbDelete(uri, id)

DbDeleteAll(uri)

DbIdList(uri)

DbMaxId(uri)

DbNextId(uri)

MapiCommand(group, name, [argument])

MapiCommandGet(group, name)

ApiSend(uri, [verb], [data], [id], [bodyKind])

ApiJson(uri, [verb], [data], [id], [bodyKind])

ApiRaw(uri, verb, [rawJson])

CvLastWarning()

db 엔드포인트를 읽고 쓰는 함수

db 그룹은 Assign 으로 감싸는 규칙이 항상 같습니다. 그래서 그 규칙을 함수가 대신 처리하고, 우리는 알맹이만 넘기면 됩니다.

' 전체 조회 - 응답 문자열 그대로
Debug.Print DbReadAll("db/NODE")

' 하나만 조회
Debug.Print DbReadOne("db/NODE", 1)

파싱된 형태로 바로 받고 싶다면 DbItemsDbItem 을 씁니다. 항목 이름 껍데기를 벗겨서 "1" -> {...} 모양의 Dictionary를 돌려주므로 바로 훑을 수 있습니다.

Dim nodes As Object, k As Variant
Set nodes = DbItems("db/NODE")

For Each k In nodes.Keys
    Debug.Print k & " : Z = " & nodes(k)("Z")
Next k

' 하나만
Debug.Print DbItem("db/NODE", 1)("X")

쓰기도 마찬가지입니다. 여러 개를 한 번에 보낼 때는 DbCreate / DbUpdate, 하나만 보낼 때는 DbCreateOne / DbUpdateOne 입니다.

' 하나만 - 필드만 넘기면 된다
DbUpdateOne "db/NODE", 1, JObj("X", 0, "Y", 0, "Z", 3.5)

' 여러 개 - 번호를 열쇠로 담아서
DbUpdate "db/NODE", JObj( _
        "1", JObj("X", 0, "Y", 0, "Z", 0), _
        "2", JObj("X", 10, "Y", 0, "Z", 0))

⚠️ 주의

DbDelete 는 지정한 번호를, DbDeleteAll 은 그 항목 전체를 지웁니다. 둘 다 되돌릴 수 없습니다. 특히 DbDeleteAll 은 모델의 해당 데이터를 통째로 비우므로 실행 전에 반드시 확인하십시오.

DbDelete "db/SECT", 3        ' 3번 단면만
DbDeleteAll "db/SECT"        ' 단면 전체 - 되돌릴 수 없음

번호를 자동으로 붙이기

새 항목을 만들 때 몇 번을 써야 하는지 매번 확인하는 것은 번거롭습니다. 세 함수가 이를 대신합니다.

함수 돌려주는 것
DbIdList(uri) 등록된 번호 전부 (문자열 배열)
DbMaxId(uri) 가장 큰 번호. 하나도 없으면 0
DbNextId(uri) 비어 있는 다음 번호
Dim newId As Long
newId = DbNextId("db/SECT")

SectionHSection newId, "H 400x200", 0.4, 0.2, 0.008, 0.013
Debug.Print "만든 단면 번호: " & newId

명령 실행하기

ope, post, doc 그룹은 Assign 이 아니라 Argument 로 감쌉니다. MapiCommand 가 그 규칙을 처리합니다.

' 993번 단면의 단면 특성 계산
Debug.Print MapiCommand("ope", "SECTPROP", "993")

' 인자가 필요 없는 명령
Debug.Print MapiCommand("doc", "SAVE")

' 인자가 여러 값일 때
Debug.Print MapiCommand("ope", "ANALYSIS", JObj("RUN", True))

GET으로 물어보는 명령은 MapiCommandGet 입니다. 바디를 보내지 않습니다.

Debug.Print MapiCommandGet("ope", "SECT_SHAPE")

어떤 엔드포인트든 보내는 ApiSend

위 함수들이 모두 ApiSend 위에 얹혀 있습니다. 직접 부르면 메서드와 감싸는 이름까지 세밀하게 지정할 수 있습니다.

인자
uri "db/NODE", "post/TABLE", "design/RC/KDS-41-20-2022/DCRM"
verb 생략하면 바디가 있는지 없는지를 보고 알아서 정합니다
data Dictionary, Collection, 배열, 숫자, 완성된 JSON 문자열 모두 가능
id 주면 주소 뒤에 /번호 를 붙입니다
bodyKind A Assign, G Argument, N 항목 이름, - 바디 없음
' 메서드를 맡기고 보내기
ApiSend "db/NODE", , JObj("1", JObj("X", 0, "Y", 0, "Z", 0))

' 메서드와 번호를 직접 지정
ApiSend "db/SECT", "DELETE", , 3

' 목록에 없는 새 엔드포인트라 감싸는 이름을 알려 줘야 할 때
ApiSend "ope/NEWTHING", "POST", "993", , "G"

응답을 문자열이 아니라 파싱된 객체로 받고 싶다면 ApiJson 을 쓰면 됩니다. 실패하면 Nothing 입니다.

Dim result As Object
Set result = ApiJson("db/NODE")
If Not result Is Nothing Then Debug.Print JCount(JVal(result, "NODE"))

모듈이 알고 있는 규칙과 다르게 보냈다면 CvLastWarning 에 그 내용이 남습니다. 뜻대로 동작하지 않을 때 먼저 확인해 볼 곳입니다.

ApiSend "db/NODE", "POST"
Debug.Print CvLastWarning()

바디를 그대로 보내야 할 때

이미 완성된 JSON 문자열이 있고 모듈이 아무것도 건드리지 않기를 바란다면 ApiRaw 를 씁니다. 감싸는 이름을 붙이지 않고 문자열을 그대로 전송합니다.

Dim jsonBody As String
jsonBody = "{""Assign"":{""1"":{""X"":0,""Y"":0,""Z"":0}}}"

Debug.Print ApiRaw("db/NODE", "PUT", jsonBody)

💡 Tip

매뉴얼의 예제 JSON을 그대로 시험해 보고 싶을 때 ApiRaw 가 가장 편합니다. 예제가 동작하는 것을 확인한 뒤 JObj 로 옮겨 적으면 실수를 줄일 수 있습니다.

 

0
컨텐츠가 도움이 되셨나요?