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.batcd "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:Polyline、5: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]) # MayaのY-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로 읽어서 작업하면 됩니다.
캡처 한 후 원점 근처로 객체를 이동시켜 버리면 그 후에는 스케일을 수정해도 괜찮습니다.
Reference
이 문제에 관하여(Maya + pyshp로 도형 파일 (.shp) 가져 오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Takeharu_Yabe/items/61c5abe3ef158cf9eb07
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이 기사에서는 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:Polyline、5: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]) # MayaのY-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로 읽어서 작업하면 됩니다.
캡처 한 후 원점 근처로 객체를 이동시켜 버리면 그 후에는 스케일을 수정해도 괜찮습니다.
Reference
이 문제에 관하여(Maya + pyshp로 도형 파일 (.shp) 가져 오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Takeharu_Yabe/items/61c5abe3ef158cf9eb07텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)