Добавить PLY-загрузку и Docker Web UI с PCL-пайплайном.

PLY читается в FilePointCloudSource, CLI отдаёт геометрию в output JSON,
а Docker/FastAPI/Three.js дают веб-запуск пайплайна без конфликта libpq на хосте.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-18 10:39:34 +03:00
co-authored by Cursor
parent 98afe5af5a
commit 45b2ed6e22
17 changed files with 1332 additions and 36 deletions
+154
View File
@@ -0,0 +1,154 @@
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Inter, Segoe UI, Roboto, sans-serif;
background: #0f1720;
color: #e8eef5;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
padding: 20px 24px;
border-bottom: 1px solid #243447;
background: #152231;
}
.header h1 {
margin: 0 0 4px;
font-size: 24px;
}
.header p {
margin: 0;
color: #9db0c3;
}
.health {
padding: 8px 12px;
border-radius: 8px;
background: #1f2f40;
font-size: 13px;
}
.health.ok {
background: #173528;
color: #9be7b5;
}
.health.error {
background: #3a1d24;
color: #ffb4c0;
}
.layout {
display: grid;
grid-template-columns: 360px 1fr;
gap: 16px;
padding: 16px;
min-height: calc(100vh - 96px);
}
.panel {
background: #152231;
border: 1px solid #243447;
border-radius: 12px;
padding: 16px;
}
.panel h2 {
margin: 0 0 16px;
font-size: 18px;
}
.field {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 14px;
font-size: 14px;
}
.field input,
.field select,
button {
font: inherit;
}
.field input,
.field select {
padding: 10px 12px;
border-radius: 8px;
border: 1px solid #31465d;
background: #0f1720;
color: inherit;
}
button {
width: 100%;
padding: 12px 14px;
border: 0;
border-radius: 8px;
background: #3b82f6;
color: white;
cursor: pointer;
font-weight: 600;
}
button:disabled {
opacity: 0.6;
cursor: wait;
}
.status {
margin: 14px 0 0;
color: #9db0c3;
font-size: 14px;
line-height: 1.4;
white-space: pre-wrap;
}
.metrics {
margin-top: 16px;
padding-top: 16px;
border-top: 1px solid #243447;
display: grid;
gap: 8px;
font-size: 14px;
}
.hidden {
display: none;
}
.viewer {
display: flex;
flex-direction: column;
min-height: 70vh;
}
#viewport {
flex: 1;
min-height: 520px;
border-radius: 10px;
overflow: hidden;
border: 1px solid #243447;
background: #0b1118;
}
.hint {
margin: 12px 0 0;
color: #7f93a8;
font-size: 13px;
}
@media (max-width: 960px) {
.layout {
grid-template-columns: 1fr;
}
}