flow.viewer
flow.viewer(viewer_key: str, *, results: list | tuple,
x: float = 0.0, y: float = 0.0) -> None같은 Flow의 공개 결과 handle을 표시 순서대로 연결합니다. 계산 노드를 추가하거나 실행하지 않습니다. 내부 Node port는 먼저 flow.result()로 공개해야 합니다.
from pipelinexlab import px
class Numbers(px.Results):
area: float
@px.function(key="area", version="1.0.0", description="Rectangle area")
def area(width: float, depth: float) -> Numbers:
return Numbers(area=width * depth)
flow = px.Flow("rectangle", label="Rectangle", description="Area calculation")
node = flow.node("calculate", area)
flow.connect(flow.input("width", float, description="Width"), node.inputs.width)
flow.connect(flow.input("depth", float, description="Depth"), node.inputs.depth)
flow.result("area", node.results.area)
flow.viewer("area_view", results=[flow.results.area], x=640.0)
with px.Client(workspace="examples", project="rectangle") as client:
client.save(flow)
run = client.run(flow, width=10.0, depth=20.0).wait(timeout_seconds=30)
print(run.read_result("area", max_bytes=1024))
assert px.dumps(px.loads(px.dumps(flow))) == px.dumps(flow)결과를 여러 개 지정하면 공용 뷰어가 그 목록에서 선택할 수 있는 연결을 저장합니다. 예를 들어 sectionproperties의 geometry/mesh/centroids는 별도 계산 결과 세 개이며 하나의 viewer에 연결할 수 있습니다. 목록은 비어 있거나 중복될 수 없고 다른 Flow의 handle은 거절합니다. 좌표는 유한한 숫자여야 합니다. 같은 viewer key를 다시 선언하면 덮어쓰지 않고 거절합니다.
뷰어가 없는 새 Flow는 기존 파일 버전 1을 사용합니다. viewer()를 선언하면 버전 2를 사용하며 기존 px.dumps, px.loads, client.save, client.export_documents로 연결을 보존합니다. 버전 2를 지원하지 않는 native Runtime은 거절하므로 SDK와 Runtime을 함께 갱신해야 합니다.
저장되는 renderer는 host 소유 core.result@1입니다. 선택 Run·로딩·확대 상태, 파일 주소·bytes는 Flow 문서에 저장하지 않습니다. 조회는 기존 Run 권한과 결과 타입/MIME을 따릅니다.
Flow 화면은 저장된 viewer 연결을 읽고 Data/Results와 같은 선택 Run을 표시합니다. 표·PNG의 조회는 공용 Run reader를 사용하며, 뷰어 열기·이동·복제·결과 탭 전환으로 계산을 다시 실행하지 않습니다. 선택 Run이 없으면 실행 결과가 없다는 안내를 표시합니다.
Report는 같은 결과를 connection의 출력 매핑으로 반영합니다. Flow 직접 실행만으로 Report를 자동 수정하지 않습니다. 같은 Run을 Flow와 Report에서 확인하기를 참고하세요. 이 동작에는 해당 Project의 Run 조회·실행 host가 연결돼 있어야 합니다. SDK/API와 제품 코드의 지원이 특정 공개 주소에 그 서비스를 배포했다는 뜻은 아닙니다.
viewer()는 최초 저장 전 Flow 선언에 사용합니다. 기존 client.save의 first-save 규칙을 바꾸거나 저장된 Flow head를 덮어쓰지 않습니다. 기존 저장 Flow의 편집은 Plan/Apply API를 사용합니다.