Maya + pyshp로 도형 파일 (.shp) 가져 오기

CG 소프트웨어에 Shapefile을 캡처하고 싶습니다.



건축계 CG 프로덕션에서 일하는 3DCG 모델러입니다.

건축 CG를 제작하고 있다면, 때로는 셰이프 파일(.shp) 을 CG 소프트에 받아들이고 싶을 때가 있습니다.
지도 뭔가를 캡처하고 싶을 때입니다.
GIS 계의 소프트는 가지고 있지 않지만, 무엇인가 간편하게 받아들일 수 없는 것인가?
그렇다면 사용할 수있는 방법을 소개합니다.

파이썬 + pyshp



CG 계열의 소프트웨어는 스크립팅 환경으로 Python을 사용할 수있는 경우가 많습니다.
Python에는 pyshp라는 도형 파일을 처리하는 라이브러리가 있으므로이를 사용하여 .shp 파일을 가져올 수 있습니다.
pyshp

마야



이 기사에서는 Maya에 .shp 파일을 가져 와서 Curve로 그리는 방법에 대해 씁니다.

pyshp를 Maya에 설치



먼저 Maya의 Python 인 "mayapy"에 pyshp를 설치합니다.

install.bat
cd "C:\Program Files\Autodesk\Maya2018\bin"
"mayapy.exe" -m pip install "C:\Users\Takeharu\Documents\maya\3rdParty\pyshp-2.1.0.tar.gz"


스크립팅



그리고 Maya 용 Python 스크립트.

import_shapefile.py

# -*- coding: utf-8 -*-
import pymel.core as pm
import shapefile
import os.path

#  ファイルオープンダイアログ
def get_file():
    startdir = ''
    if pm.optionVar( exists='defaultStarDirectoryOfImportShapefile' ):
        startdir = pm.optionVar( q='defaultStarDirectoryOfImportShapefile' )
    else:
        startdir = 'C:/Users/Takeharu/Documents'
    fn = pm.fileDialog2(fileMode=1, caption="Open Shape File...", fileFilter="*.shp", startingDirectory=startdir, okCaption='Open')
    pm.optionVar( sv=('defaultStarDirectoryOfImportShapefile', os.path.dirname(fn[0])) )
    return fn[0]



file_path = get_file()  # ファイルパス取得
with open(file_path, "rb") as myshp:  #  ファイルを開く
    r = shapefile.Reader(shp = myshp)  # リーダー
    if len(r.shapes()):
        pm.refresh(suspend=True)
        grp = pm.group(empty=1,name='shp_group0')
        crvs = []
        for s in r.shapes():
            t = s.shapeType
            if t == 3 or t == 5:  # 今回は地図をCurveで描画したいだけなので、シェイプのタイプを 3:Polyline5:Polygonに限定します。
                mapped = map(lambda x: x+(0.0,), s.points)  # 元が2D座標データなので、Z軸座標を追加して3次元座標に変換します。
                crv = None
                if len(s.parts) == 1:
                    crv = pm.curve(p=mapped,d=1)
                    crvs.append(crv)
                else:  # ひとつのシェイプに複数のPolygonが含まれることがあります。それ切り分けます。
                       # parts`が[0,256,150] みたいなリストなら、複数のオブジェクトを内包しています。
                       # 数字は座標リストの区切りです。
                    for i in range(0,len(s.parts)-1):  
                        pnts = []
                        pnts = mapped[s.parts[i]:s.parts[i+1]]
                        crv = pm.curve(p=pnts,d=1)
                        crvs.append(crv)
                    crv = pm.curve(p=mapped[s.parts[-1]:],d=1)
                    crvs.append(crv)

        pm.parent(crvs,grp)
        g = grp.getParent()
        pm.select(grp,r=1)
        pm.rotate(g, [-90.0,0,0]) # MayaY-Upに合わせて全体を回転します。
        pm.viewFit( pm.selected())
        pm.refresh(suspend=False)

    for c in pm.ls(cameras=1): # 地図の場合、巨大な図形となるので、カメラのクリッピングプレーンを調整します。
        c.setFarClipPlane(1000000)
        c.setNearClipPlane(1)


# ※コピペするときは、使う前にコメントを全部削除してください。

선반 버튼

import sys
if 'terrain.import_shapefile' in sys.modules:
    reload(terrain.import_shapefile)
else:
    import terrain.import_shapefile


도로의 데이터를 가져온 상태

원본 데이터가 클 경우 상당한 시간이 소요됩니다. 때로는 몇 시간이 걸릴 수 있습니다.
언뜻 보면 얼어 붙은 것처럼 보이더라도 떠나면 그 중 끝납니다.
그것이 Maya.

Maya 단위 이야기



Maya 단위에 대해 알아두면 좋을 것 같습니다.
Maya는 CAD 소프트웨어 등에 비해 내부 정밀도가 낮습니다.
따라서 원점에서 멀리 떨어진 위치에 도형을 그리는 것이 약합니다.

GIS계의 데이터인 셰이프 파일은, 이 「원점으로부터 멀리 떨어진 위치」에 좌표를 가지는 것이 드물지 않습니다.
이것을 Maya의 기본 단위 인 cm으로 변환하고 캡처하려고하면 그리기 오류가 발생할 수 있습니다.

자세한 것은 모릅니다만, "자릿수 떨어짐"이라든가 그러한 종류의 에러라고 생각됩니다.
DXF/DWG를 캡처하려고 하면 왠지 그림이 나오지 않을 때는 이것일지도 모릅니다.

번거로움을 피하고 싶다면 1유닛 = 1cm가 아니라 1유닛 = 1m로 읽어서 작업하면 됩니다.
캡처 한 후 원점 근처로 객체를 이동시켜 버리면 그 후에는 스케일을 수정해도 괜찮습니다.

좋은 웹페이지 즐겨찾기