Skip to main content

cumulus3d_cli/
lib.rs

1//! cumulus3d 실행 파일의 라이브러리 부분: 점진 스트림 파이프라인과 단계별 호환 하위 명령([`interop`]).
2//!
3//! - [`session`]: 상태 값 [`session::Session`] 과 리듀서 함수 [`session::step`] / [`session::poll`] /
4//!   [`session::command`] / [`session::finish`].
5//! - [`pipeline`]: 리듀서를 감싸 훅·큐 정책·패닉 격리·구독 채널을 제공하는 [`pipeline::Pipeline`].
6//! - [`events`]: 단계별 결과 [`events::Event`] 와 명령 [`events::Command`].
7//! - [`sinks`]: `cumulus3d stream` 의 파일 출력(timeline.txt, run.log, PLY, 스냅샷)을 만드는 기본 훅.
8//! - [`stream`]: 입력 폴더 → 세션 → 파이프라인 조립([`stream::run_stream`]).
9//!
10//! # 사용 예
11//!
12//! 영상 폴더(`images/camF|camR|camL/*.jpg`, `gps_ref.txt`)를 위치 단위로 넣어 점진 재구성하고,
13//! 기본 출력 훅으로 `cumulus3d stream` 과 같은 파일을 만든다.
14//!
15//! ```no_run
16//! use cumulus3d_cli::events::{Event, EventKind};
17//! use cumulus3d_cli::pipeline::Pipeline;
18//! use cumulus3d_cli::session::{Input, Session, SessionConfig};
19//! use cumulus3d_cli::sinks::{self, SinkOptions};
20//! use cumulus3d_cli::stream::{frame_set, Layout};
21//! use cumulus3d_core::io::read_gps_file;
22//! use std::path::Path;
23//!
24//! fn main() -> Result<(), String> {
25//!     let src = Path::new("data");
26//!     let layout = Layout::discover(src, 3)?;
27//!     let mut cfg = SessionConfig::new(src.join("images"));
28//!     cfg.gps = read_gps_file(src.join("gps_ref.txt")).map_err(|e| e.to_string())?;
29//!     cfg.total_positions = Some(layout.frames.len());
30//!
31//!     let pipeline = Pipeline::new(Session::new(cfg)).on(EventKind::ZonePreview, |e: &Event| {
32//!         if let Event::ZonePreview { range, cloud, .. } = e {
33//!             println!("초벌 구역 {}: 점 {}", range.zone, cloud.len());
34//!         }
35//!     });
36//!     let mut pipeline = sinks::attach(pipeline, Path::new("out"), &SinkOptions::default()).map_err(|e| e.to_string())?;
37//!     for p in 0..layout.frames.len() {
38//!         pipeline.push(Input::Frames(frame_set(&layout, p)));
39//!     }
40//!     let (_session, summary) = pipeline.finish();
41//!     println!("이벤트 {} 개", summary.events);
42//!     Ok(())
43//! }
44//! ```
45//!
46//! 훅 없이 상태 값만 주고받는 함수형 사용:
47//!
48//! ```no_run
49//! use cumulus3d_cli::session::{finish, step, FrameSet, Session, SessionConfig};
50//!
51//! let s0 = Session::new(SessionConfig::new("data/images"));
52//! let frames = FrameSet::new([("camF", "camF/camF_0000.jpg"), ("camR", "camR/camR_0000.jpg")]);
53//! let (s1, events) = step(&s0, frames);
54//! for e in &events {
55//!     if let Some(t) = e.timeline_text() {
56//!         println!("{t}");
57//!     }
58//! }
59//! let (_done, _summary_events) = finish(&s1);
60//! ```
61
62#![warn(missing_docs)]
63
64pub mod interop;
65pub mod densewrap;
66pub mod events;
67pub mod fusion_variants;
68pub mod pipeline;
69pub mod post;
70pub mod session;
71pub mod sinks;
72pub mod stream;
73pub mod util;