- 엔진(자체 · NumPy · SciPy): 평면 · 쐐기(교선) · 전도 Markland(측방 한계 20° 기본) · 평면 Hoek-Bray(인장균열 없음 · 임계 · 깊이 · 수압 · kh · 수동 볼트) · 쐐기 SWedge 꼴(미끄럼 방향 8 경우 · 두 면 · 한 면 · 수압 중력식 · kh · 볼트) - 스테레오넷 좌표(등각 · 등면적 하반구 · 극점 · 대원 · 교선 · 마찰원 · 일광 엔벨로프 · 위험 영역 = 판정 부등식) - 길: 절리 작업본 E06_StabRock/joints.json(초기값 · 저장 · 초기화) · 해석 = 암 측점 깎기 쪽만 · 파생 저장본 stab_rock · 결과 · 측점 스테레오넷 - 화면: 좌 절리군 표 · 설정 / 가운데 위험 띠 · 스테레오넷 / 우 측점 결과 · 안전율 표 · E 단계 막대에 E06(끝에 덧붙임) - 시험 test_536_1(Hoek Sau Mau Ping 0.8184 · 1.0655 · Sharma 윗면 무게 · Hoek-Bray 쐐기 계수 · Kumsar · Priest 두 예제 · Markland 경계 · 투영 왕복 · 위험 영역 = 판정) · test_528 E 단계 수 4 → 5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
486 lines
8.2 KiB
CSS
486 lines
8.2 KiB
CSS
/* =============================================================================
|
|
* E06_StabRock_UI_Style.css
|
|
* E06 암반 해석 — 좌측 절리 표 · 설정 / 가운데 위험 띠 · 스테레오넷 / 우측 측점 결과
|
|
* 색은 테마 토큰(밝음 · 어두움 같이) · 판정 · 모드 · 절리 색만 고정색(E03 판정색과 같음)
|
|
* ========================================================================== */
|
|
|
|
.e06-page {
|
|
--e06-ng: #d03b3b;
|
|
--e06-ok: #0ca30c;
|
|
--e06-check: #e0a106;
|
|
--e06-none: #9a9a95;
|
|
--e06-planar: #d03b3b;
|
|
--e06-wedge: #f1963b;
|
|
--e06-toppling: #9b6dde;
|
|
height: 100dvh;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.e06-row {
|
|
height: 100%;
|
|
}
|
|
|
|
.e06-center {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-8);
|
|
height: 100%;
|
|
min-height: 0;
|
|
padding: var(--spacing-12) 0 var(--spacing-12) var(--spacing-12);
|
|
box-sizing: border-box;
|
|
overflow: auto;
|
|
}
|
|
|
|
.e06-empty,
|
|
.e06-hint,
|
|
.e06-status,
|
|
.e06-kin {
|
|
margin: 0;
|
|
white-space: pre-line;
|
|
color: var(--color-text-muted);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.e06-empty {
|
|
padding: var(--spacing-16);
|
|
}
|
|
|
|
.e06-status.is-error {
|
|
color: var(--color-danger);
|
|
}
|
|
|
|
.e06-kin {
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-panel .ui-sidebar-actions {
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.e06-stale {
|
|
padding: var(--spacing-8) var(--spacing-12);
|
|
border-radius: var(--radius-sm);
|
|
background: color-mix(in srgb, var(--color-warning) 18%, var(--color-surface));
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-stale[hidden] {
|
|
display: none;
|
|
}
|
|
|
|
/* ---- 좌측 표 · 설정 ---- */
|
|
.e06-table-wrap {
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.e06-table {
|
|
border-collapse: collapse;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.e06-table th {
|
|
padding: 2px 3px;
|
|
font-weight: var(--font-weight-medium);
|
|
color: var(--color-text-secondary);
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.e06-table td {
|
|
padding: 1px 2px;
|
|
}
|
|
|
|
.e06-input {
|
|
width: 4.2em;
|
|
padding: 2px 4px;
|
|
border: 1px solid var(--color-border);
|
|
border-radius: var(--radius-sm);
|
|
background: var(--color-surface);
|
|
color: var(--color-text);
|
|
font: inherit;
|
|
font-size: 12px;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.e06-input--name {
|
|
width: 3.6em;
|
|
}
|
|
|
|
select.e06-input {
|
|
width: auto;
|
|
}
|
|
|
|
.e06-input.is-invalid {
|
|
border-color: var(--color-danger);
|
|
background: color-mix(in srgb, var(--color-danger) 12%, var(--color-surface));
|
|
}
|
|
|
|
.e06-row-actions {
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
margin-top: var(--spacing-4);
|
|
}
|
|
|
|
.e06-setting {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: var(--spacing-8);
|
|
margin: 2px 0;
|
|
font-size: 12px;
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-setting .e06-input {
|
|
width: 5.5em;
|
|
}
|
|
|
|
/* ---- 가운데 ---- */
|
|
.e06-toolbar {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--spacing-12);
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.e06-title {
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-toggle {
|
|
display: inline-flex;
|
|
gap: var(--spacing-4);
|
|
}
|
|
|
|
.e06-toggle .ui-btn.is-on {
|
|
border-color: var(--color-primary);
|
|
background: var(--color-primary);
|
|
color: var(--color-primary-text);
|
|
}
|
|
|
|
.e06-stage {
|
|
display: flex;
|
|
gap: var(--spacing-12);
|
|
align-items: flex-start;
|
|
flex-wrap: wrap;
|
|
padding: var(--spacing-8);
|
|
border-radius: var(--radius-sm);
|
|
background: var(--color-surface-raised);
|
|
}
|
|
|
|
.e06-net-slot {
|
|
flex: 1 1 360px;
|
|
max-width: 560px;
|
|
}
|
|
|
|
.e06-net {
|
|
display: block;
|
|
width: 100%;
|
|
height: auto;
|
|
color: var(--color-text);
|
|
font-size: 11px;
|
|
}
|
|
|
|
.e06-net__rim {
|
|
fill: var(--color-surface);
|
|
stroke: var(--color-text);
|
|
stroke-width: 1.4;
|
|
}
|
|
|
|
.e06-net__zone {
|
|
stroke: none;
|
|
opacity: 0.28;
|
|
}
|
|
|
|
.e06-net__zone--planar {
|
|
fill: var(--e06-planar);
|
|
}
|
|
|
|
.e06-net__zone--wedge {
|
|
fill: var(--e06-wedge);
|
|
}
|
|
|
|
.e06-net__zone--toppling {
|
|
fill: var(--e06-toppling);
|
|
}
|
|
|
|
.e06-net__friction {
|
|
fill: none;
|
|
stroke: var(--color-text-secondary);
|
|
stroke-width: 1;
|
|
stroke-dasharray: 5 3;
|
|
}
|
|
|
|
.e06-net__friction--line {
|
|
stroke-dasharray: 2 3;
|
|
}
|
|
|
|
.e06-net__envelope {
|
|
fill: none;
|
|
stroke: var(--e06-planar);
|
|
stroke-width: 1;
|
|
stroke-dasharray: 6 3;
|
|
}
|
|
|
|
.e06-net__gc {
|
|
fill: none;
|
|
stroke: currentColor;
|
|
stroke-width: 1.2;
|
|
}
|
|
|
|
.e06-net__slope {
|
|
fill: none;
|
|
stroke: var(--color-text);
|
|
stroke-width: 2.6;
|
|
}
|
|
|
|
.e06-net__slope-pole {
|
|
fill: var(--color-text);
|
|
}
|
|
|
|
.e06-net__pole circle {
|
|
fill: currentColor;
|
|
stroke: var(--color-surface);
|
|
stroke-width: 1;
|
|
}
|
|
|
|
.e06-net__pole.is-risk circle,
|
|
.e06-net__line.is-risk path {
|
|
stroke: var(--e06-ng);
|
|
stroke-width: 2.4;
|
|
}
|
|
|
|
.e06-net__pole text,
|
|
.e06-net__line text,
|
|
.e06-net__dir {
|
|
fill: var(--color-text);
|
|
}
|
|
|
|
.e06-net__line path {
|
|
fill: var(--e06-wedge);
|
|
stroke: var(--color-surface);
|
|
}
|
|
|
|
.e06-net__tick {
|
|
stroke: var(--color-text-secondary);
|
|
}
|
|
|
|
.e06-tone-0 {
|
|
color: #2f6fd6;
|
|
}
|
|
.e06-tone-1 {
|
|
color: #1f9d6a;
|
|
}
|
|
.e06-tone-2 {
|
|
color: #c2410c;
|
|
}
|
|
.e06-tone-3 {
|
|
color: #7c4dcc;
|
|
}
|
|
.e06-tone-4 {
|
|
color: #b8860b;
|
|
}
|
|
.e06-tone-5 {
|
|
color: #0e7490;
|
|
}
|
|
|
|
.e06-legend {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
font-size: 12px;
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-legend__row {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
.e06-legend__mark {
|
|
display: inline-block;
|
|
width: 16px;
|
|
height: 10px;
|
|
border-radius: 2px;
|
|
}
|
|
|
|
.e06-legend__mark--slope {
|
|
height: 3px;
|
|
background: var(--color-text);
|
|
}
|
|
.e06-legend__mark--friction {
|
|
height: 0;
|
|
border-top: 1px dashed var(--color-text-secondary);
|
|
}
|
|
.e06-legend__mark--daylight {
|
|
height: 0;
|
|
border-top: 1px dashed var(--e06-planar);
|
|
}
|
|
.e06-legend__mark--planar {
|
|
background: color-mix(in srgb, var(--e06-planar) 35%, transparent);
|
|
}
|
|
.e06-legend__mark--wedge {
|
|
background: color-mix(in srgb, var(--e06-wedge) 35%, transparent);
|
|
}
|
|
.e06-legend__mark--toppling {
|
|
background: color-mix(in srgb, var(--e06-toppling) 35%, transparent);
|
|
}
|
|
.e06-legend__mark--line {
|
|
width: 10px;
|
|
background: var(--e06-wedge);
|
|
clip-path: polygon(50% 0, 100% 100%, 0 100%);
|
|
}
|
|
.e06-legend__mark--pole {
|
|
width: 10px;
|
|
border-radius: 50%;
|
|
background: #2f6fd6;
|
|
}
|
|
|
|
/* ---- 위험 띠 ---- */
|
|
.e06-band {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
}
|
|
|
|
.e06-band__legend {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
flex-wrap: wrap;
|
|
font-size: 12px;
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-band__count {
|
|
margin-right: 6px;
|
|
color: var(--color-text-secondary);
|
|
}
|
|
|
|
.e06-band__strip {
|
|
position: relative;
|
|
height: 18px;
|
|
border-radius: var(--radius-sm);
|
|
background: var(--color-surface-raised);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.e06-band__seg {
|
|
position: absolute;
|
|
top: 0;
|
|
bottom: 0;
|
|
padding: 0;
|
|
border: none;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.e06-band__seg--ng {
|
|
background: var(--e06-ng);
|
|
}
|
|
.e06-band__seg--ok {
|
|
background: var(--e06-ok);
|
|
}
|
|
.e06-band__seg--check {
|
|
background: var(--e06-check);
|
|
}
|
|
.e06-band__seg--none {
|
|
background: var(--e06-none);
|
|
}
|
|
|
|
.e06-band__seg.is-active {
|
|
outline: 2px solid var(--color-text);
|
|
outline-offset: -2px;
|
|
z-index: 1;
|
|
}
|
|
|
|
.e06-band__ticks {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: 11px;
|
|
color: var(--color-text-secondary);
|
|
}
|
|
|
|
/* ---- 우측 ---- */
|
|
.e06-side {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-12);
|
|
}
|
|
|
|
.e06-list-slot {
|
|
max-height: 46vh;
|
|
overflow: auto;
|
|
}
|
|
|
|
.e06-list,
|
|
.e06-cases {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
font-size: 12px;
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-list th,
|
|
.e06-cases th {
|
|
position: sticky;
|
|
top: 0;
|
|
padding: 3px 4px;
|
|
background: var(--color-surface);
|
|
color: var(--color-text-secondary);
|
|
font-weight: var(--font-weight-medium);
|
|
text-align: left;
|
|
}
|
|
|
|
.e06-list td,
|
|
.e06-cases td {
|
|
padding: 3px 4px;
|
|
border-top: 1px solid var(--color-border);
|
|
}
|
|
|
|
.e06-list tbody tr {
|
|
cursor: pointer;
|
|
}
|
|
|
|
.e06-list tbody tr:hover {
|
|
background: var(--color-surface-raised);
|
|
}
|
|
|
|
.e06-list tr.is-active {
|
|
background: color-mix(in srgb, var(--color-primary) 16%, transparent);
|
|
}
|
|
|
|
.e06-detail h4 {
|
|
margin: 0 0 4px;
|
|
color: var(--color-text);
|
|
}
|
|
|
|
.e06-verdict {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
font-weight: var(--font-weight-medium);
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.e06-verdict::before {
|
|
content: "";
|
|
width: 9px;
|
|
height: 9px;
|
|
border-radius: 50%;
|
|
background: var(--e06-none);
|
|
}
|
|
|
|
.e06-verdict--ng::before {
|
|
background: var(--e06-ng);
|
|
border-radius: 2px;
|
|
transform: rotate(45deg);
|
|
}
|
|
.e06-verdict--ok::before {
|
|
background: var(--e06-ok);
|
|
}
|
|
.e06-verdict--check::before {
|
|
background: var(--e06-check);
|
|
border-radius: 0;
|
|
clip-path: polygon(50% 0, 100% 100%, 0 100%);
|
|
}
|