Commit 485644ae by jiang'yun

修改

parent dfd5cc55
<template>
<div class="navbar">
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb v-if="!topNav" id="breadcrumb-container" class="breadcrumb-container" />
<hamburger
id="hamburger-container"
:is-active="sidebar.opened"
class="hamburger-container"
@toggleClick="toggleSideBar"
/>
<breadcrumb
v-if="!topNav"
id="breadcrumb-container"
class="breadcrumb-container"
/>
<top-nav v-if="topNav" id="topmenu-container" class="topmenu-container" />
<div class="right-menu">
<template v-if="device!=='mobile'">
<search id="header-search" class="right-menu-item" />
<template v-if="device !== 'mobile'">
<!-- <search id="header-search" class="right-menu-item" /> -->
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip>
<screenfull id="screenfull" class="right-menu-item hover-effect" />
</el-tooltip> -->
<!-- <screenfull id="screenfull" class="right-menu-item hover-effect" /> -->
<!--
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</el-tooltip> -->
</template>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<el-dropdown
class="avatar-container right-menu-item hover-effect"
trigger="click"
>
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<img :src="avatar" class="user-avatar" />
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
......@@ -47,15 +58,15 @@
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
import { mapGetters } from "vuex";
import Breadcrumb from "@/components/Breadcrumb";
import TopNav from "@/components/TopNav";
import Hamburger from "@/components/Hamburger";
import Screenfull from "@/components/Screenfull";
import SizeSelect from "@/components/SizeSelect";
import Search from "@/components/HeaderSearch";
import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from "@/components/RuoYi/Doc";
export default {
components: {
......@@ -66,48 +77,46 @@ export default {
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc
RuoYiDoc,
},
computed: {
...mapGetters([
'sidebar',
'avatar',
'device'
]),
...mapGetters(["sidebar", "avatar", "device"]),
setting: {
get() {
return this.$store.state.settings.showSettings
return this.$store.state.settings.showSettings;
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val
})
}
this.$store.dispatch("settings/changeSetting", {
key: "showSettings",
value: val,
});
},
},
topNav: {
get() {
return this.$store.state.settings.topNav
}
}
return this.$store.state.settings.topNav;
},
},
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
this.$store.dispatch("app/toggleSideBar");
},
logout() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index'
this.$confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
}).catch(() => {})
}
}
}
.then(() => {
this.$store.dispatch("LogOut").then(() => {
location.href = "/index";
});
})
.catch(() => {});
},
},
};
</script>
<style lang="scss" scoped>
......@@ -116,18 +125,18 @@ export default {
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
transition: background 0.3s;
-webkit-tap-highlight-color: transparent;
&:hover {
background: rgba(0, 0, 0, .025)
background: rgba(0, 0, 0, 0.025);
}
}
......@@ -164,10 +173,10 @@ export default {
&.hover-effect {
cursor: pointer;
transition: background .3s;
transition: background 0.3s;
&:hover {
background: rgba(0, 0, 0, .025)
background: rgba(0, 0, 0, 0.025);
}
}
}
......
<template>
<div>
<el-tooltip content="设置" placement="bottom" effect="light">
<el-button @click="editProperties" :class="{ 'active': showLineStylePanel }">
<el-button
@click="editProperties"
:class="{ active: showLineStylePanel }"
>
<i class="el-icon-setting"></i>
</el-button>
</el-tooltip>
<el-tooltip content="上传文件" placement="bottom" effect="light">
<el-button @click="triggerFileUpload">
<i class="el-icon-upload"></i>
</el-button>
</el-tooltip>
<el-select
v-model="colorMapSelect"
style="width: 280px"
placeholder="请选择颜色集合"
@change="changeColor"
>
<el-option
v-for="item in listNameColorMaps"
:label="item"
:value="item"
></el-option>
</el-select>
<el-dialog title="设置" :visible.sync="showPropertiesDialog" width="100%">
<el-form ref="form" label-width="130px">
<el-row>
<el-col :span="5">
<el-form-item label="颜色集合">
<el-select v-model="colorMapSelect" placeholder="请选择颜色集合" @change="changeColor">
<el-option v-for="item in listNameColorMaps" :label="item" :value="item"></el-option>
<el-select
v-model="colorMapSelect"
placeholder="请选择颜色集合"
@change="changeColor"
>
<el-option
v-for="item in listNameColorMaps"
:label="item"
:value="item"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="归一化类型">
<el-select v-model="NormalizationType" @change="changeNor" placeholder="请选择归一化类型">
<el-option v-for="item in NormalizationTypeData" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="NormalizationType"
@change="changeNor"
placeholder="请选择归一化类型"
>
<el-option
v-for="item in NormalizationTypeData"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="归一化比例">
<el-slider @change="changeNor" style="width: 180px;" v-model="NormalizationBl" :min="0.1" :max="5"
:step="0.1" show-stops>
<el-slider
@change="changeNor"
style="width: 180px"
v-model="NormalizationBl"
:min="0.1"
:max="5"
:step="0.1"
show-stops
>
</el-slider>
</el-form-item>
</el-col>
......@@ -40,7 +78,6 @@
<el-input v-model="mycds" @blur="changeMycds"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="5">
......@@ -50,22 +87,46 @@
</el-col>
<el-col :span="5">
<el-form-item label="采样插值类型">
<el-select v-model="samplesType" @change="changeInt" placeholder="请选择采样插值类型">
<el-option v-for="item in InterpolationType" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="samplesType"
@change="changeInt"
placeholder="请选择采样插值类型"
>
<el-option
v-for="item in InterpolationType"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="采样插值边缘">
<el-select v-model="samplesEdge" @change="changeInt" placeholder="请选择采样插值边缘">
<el-option v-for="item in InterpolationEdge" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="samplesEdge"
@change="changeInt"
placeholder="请选择采样插值边缘"
>
<el-option
v-for="item in InterpolationEdge"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="道插值类型">
<el-select v-model="tracesEdge" @change="changeInt" placeholder="请选择道插值类型">
<el-option v-for="item in InterpolationType" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="tracesEdge"
@change="changeInt"
placeholder="请选择道插值类型"
>
<el-option
v-for="item in InterpolationType"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
......@@ -73,44 +134,86 @@
<el-row>
<el-col :span="5">
<el-form-item label="道插值边缘">
<el-select v-model="tracesType" @change="changeInt" placeholder="请选择道插值边缘">
<el-option v-for="item in InterpolationEdge" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="tracesType"
@change="changeInt"
placeholder="请选择道插值边缘"
>
<el-option
v-for="item in InterpolationEdge"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="绘图类型">
<el-checkbox v-model="Wiggle" @change="changePlotType">Wiggle</el-checkbox>
<el-checkbox v-model="Reversed" @change="changePlotType">Reversed</el-checkbox>
<el-checkbox v-model="PositiveFill" @change="changePlotType">Positive fill</el-checkbox>
<el-checkbox v-model="NegativeFill" @change="changePlotType">Negative fill</el-checkbox>
<el-checkbox v-model="PositiveColorFill" @change="changePlotType">Positive color fill</el-checkbox>
<el-checkbox v-model="NegativeColorFill" @change="changePlotType">Negative color fill</el-checkbox>
<el-checkbox v-model="SimpleDensity" @change="changePlotType">Simple density</el-checkbox>
<el-checkbox v-model="InterpolatedDensity" @change="changePlotType">Interpolated density</el-checkbox>
<el-checkbox v-model="Wiggle" @change="changePlotType"
>Wiggle</el-checkbox
>
<el-checkbox v-model="Reversed" @change="changePlotType"
>Reversed</el-checkbox
>
<el-checkbox v-model="PositiveFill" @change="changePlotType"
>Positive fill</el-checkbox
>
<el-checkbox v-model="NegativeFill" @change="changePlotType"
>Negative fill</el-checkbox
>
<el-checkbox v-model="PositiveColorFill" @change="changePlotType"
>Positive color fill</el-checkbox
>
<el-checkbox v-model="NegativeColorFill" @change="changePlotType"
>Negative color fill</el-checkbox
>
<el-checkbox v-model="SimpleDensity" @change="changePlotType"
>Simple density</el-checkbox
>
<el-checkbox
v-model="InterpolatedDensity"
@change="changePlotType"
>Interpolated density</el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="Wiggle-裁剪因子">
<el-input v-model="ClippingFactor" @blur="changePlotType"></el-input>
<el-input
v-model="ClippingFactor"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="5">
<el-form-item label="Wiggle-抽取间距">
<el-input v-model="DecimationSpacing" @blur="changePlotType"></el-input>
<el-input
v-model="DecimationSpacing"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="Wiggle-密度抽取">
<el-checkbox v-model="densityDecimation" @change="changePlotType">Density decimation(密度抽取)</el-checkbox>
<el-checkbox v-model="densityDecimation" @change="changePlotType"
>Density decimation(密度抽取)</el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="Clipping mode(裁剪模式)">
<el-select v-model="ClippingMode" @change="changePlotType" placeholder="请选择裁剪模式">
<el-option v-for="item in ClippingModeData" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="ClippingMode"
@change="changePlotType"
placeholder="请选择裁剪模式"
>
<el-option
v-for="item in ClippingModeData"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
......@@ -118,37 +221,61 @@
<el-row>
<el-col :span="3">
<el-form-item label="TaperFilter(滤波)">
<el-checkbox v-model="TaperFilterEnbled" @change="changePlotType">启用滤波</el-checkbox>
<el-checkbox v-model="TaperFilterEnbled" @change="changePlotType"
>启用滤波</el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label="f1">
<el-input v-model="f1" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="f1"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label="f2">
<el-input v-model="f2" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="f2"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label="f3">
<el-input v-model="f3" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="f3"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="2">
<el-form-item label="f4">
<el-input v-model="f4" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="f4"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="采样率">
<el-input v-model="sampleRate" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="sampleRate"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="带通模式">
<el-checkbox v-model="passFlag" @change="changePlotType">带通模式</el-checkbox>
<el-checkbox v-model="passFlag" @change="changePlotType"
>带通模式</el-checkbox
>
</el-form-item>
</el-col>
</el-row>
......@@ -156,54 +283,95 @@
<el-row>
<el-col :span="3">
<el-form-item label="AGC">
<el-checkbox v-model="AGCEnbled" @change="changePlotType">启用AGC</el-checkbox>
<el-checkbox v-model="AGCEnbled" @change="changePlotType"
>启用AGC</el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="AGC length">
<el-input v-model="AGCLength" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="AGCLength"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="Desired average">
<el-input v-model="DesiredAverage" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="DesiredAverage"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="Noise reduction">
<el-select v-model="NoiseReduction" @change="changePlotType" placeholder="请选择降噪">
<el-option v-for="item in NoiseReductionData" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="NoiseReduction"
@change="changePlotType"
placeholder="请选择降噪"
>
<el-option
v-for="item in NoiseReductionData"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="Noise reduction percentage">
<el-input v-model="NoiseReductionPercentage" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="NoiseReductionPercentage"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="Start sample">
<el-input v-model="StartSample" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="StartSample"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="Step">
<el-input v-model="Step" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="Step"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="4">
<el-form-item label="Units">
<el-select v-model="Units" @change="changePlotType" placeholder="请选择单位">
<el-option v-for="item in UnitsData" :label="item.label" :value="item.value"></el-option>
<el-select
v-model="Units"
@change="changePlotType"
placeholder="请选择单位"
>
<el-option
v-for="item in UnitsData"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="Window length">
<el-input v-model="WindowLength" style="width: 80px" @blur="changePlotType"></el-input>
<el-input
v-model="WindowLength"
style="width: 80px"
@blur="changePlotType"
></el-input>
</el-form-item>
</el-col>
</el-row>
......@@ -211,29 +379,35 @@
<el-row>
<el-col :span="3">
<el-form-item label="Reverse">
<el-checkbox v-model="ReverseEnbled" @change="changePlotType">启用Reverse</el-checkbox>
<el-checkbox v-model="ReverseEnbled" @change="changePlotType"
>启用Reverse</el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="inverted">
<el-checkbox v-model="inverted" @change="changePlotType">启用inverted</el-checkbox>
<el-checkbox v-model="inverted" @change="changePlotType"
>启用inverted</el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="reversed">
<el-checkbox v-model="reversed" @change="changePlotType">启用reversed</el-checkbox>
<el-checkbox v-model="reversed" @change="changePlotType"
>启用reversed</el-checkbox
>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="showPropertiesDialog = false">取 消</el-button>
<el-button type="primary" @click="showPropertiesDialog = false">确 定</el-button>
<el-button type="primary" @click="showPropertiesDialog = false"
>确 定</el-button
>
</div>
</el-dialog>
<canvas ref="plot" id="canvas" />
<!-- <PropertiesDialog-->
......@@ -247,25 +421,71 @@
</template>
<script>
import { SeismicPlot } from './App.js';
import PropertiesDialog from './ui/PropertiesDialog.vue';
import { getAjv, setNodeProps, getNodeProps } from './ui/DialogPropertyUtils';
import { SeismicPlot } from "./App.js";
import PropertiesDialog from "./ui/PropertiesDialog.vue";
import { getAjv, setNodeProps, getNodeProps } from "./ui/DialogPropertyUtils";
import { getToken } from "@/utils/auth";
import { SegyReader } from '@int/geotoolkit/seismic/data/SegyReader';
import { LocalFile } from '@int/geotoolkit/seismic/data/LocalFile';
import { Reverse } from '@int/geotoolkit/seismic/pipeline/processor/Reverse';
import { AGC } from '@int/geotoolkit/seismic/pipeline/processor/AGC';
import { TaperFilterProcess } from '@int/geotoolkit/seismic/analysis/filters/TaperFilterProcess';
import { NormalizationType } from '@int/geotoolkit/seismic/pipeline/NormalizationType';
import { SeismicPipeline } from '@int/geotoolkit/seismic/pipeline/SeismicPipeline';
import { SeismicColors } from '@int/geotoolkit/seismic/util/SeismicColors';
import { SegyReader } from "@int/geotoolkit/seismic/data/SegyReader";
import { LocalFile } from "@int/geotoolkit/seismic/data/LocalFile";
import { Reverse } from "@int/geotoolkit/seismic/pipeline/processor/Reverse";
import { AGC } from "@int/geotoolkit/seismic/pipeline/processor/AGC";
import { TaperFilterProcess } from "@int/geotoolkit/seismic/analysis/filters/TaperFilterProcess";
import { NormalizationType } from "@int/geotoolkit/seismic/pipeline/NormalizationType";
import { SeismicPipeline } from "@int/geotoolkit/seismic/pipeline/SeismicPipeline";
import { SeismicColors } from "@int/geotoolkit/seismic/util/SeismicColors";
import {RgbaColor} from '@int/geotoolkit/util/RgbaColor';
let seismicPlot = null;
// 注:interpolate函数需保持原有实现(线性插值保证平滑)
function interpolate2 (target, startIndex, endIndex, startColor, endColor) {
// 添加参数验证
if (!target || !Array.isArray(target)) {
console.error('interpolate: target必须是数组');
return;
}
if (typeof startIndex !== 'number' || typeof endIndex !== 'number' ||
startIndex < 0 || endIndex >= target.length || startIndex > endIndex) {
console.error(`interpolate: 索引无效 - startIndex: ${startIndex}, endIndex: ${endIndex}, target.length: ${target.length}`);
return;
}
if (!startColor || !endColor ||
typeof startColor.R !== 'number' || typeof startColor.G !== 'number' || typeof startColor.B !== 'number' ||
typeof endColor.R !== 'number' || typeof endColor.G !== 'number' || typeof endColor.B !== 'number') {
console.error('interpolate: 颜色必须包含有效的RGB值');
return;
}
const offset = startIndex;
const stop = (endIndex - startIndex);
let r, g, b;
const stepR = (endColor.R - startColor.R) / (stop);
const stepG = (endColor.G - startColor.G) / (stop);
const stepB = (endColor.B - startColor.B) / (stop);
try {
for (let i = 0; i <= stop; ++i) {
r = startColor.R + i * stepR;
g = startColor.G + i * stepG;
b = startColor.B + i * stepB;
target[offset + i] = new RgbaColor(
Math.round(r < 255 ? r : 255),
Math.round(g < 255 ? g : 255),
Math.round(b < 255 ? b : 255),
255
);
}
} catch (error) {
console.error(`interpolate: 创建颜色时出错 - ${error.message}`);
}
}
export default {
name: "index",
components: {
PropertiesDialog
PropertiesDialog,
},
data() {
return {
......@@ -277,9 +497,10 @@ export default {
chartIsActive: false,
tableIsActive: false,
listNameColorMaps: [
"ces",
"RedWhiteBlue",
"WhiteBlack",
"RedWhiteBlack",
"RedWhiteBlue",
"Saddleback",
"Angles5color",
"BlackRedYellowWhite",
......@@ -293,9 +514,9 @@ export default {
"RedWhiteBlueHot",
"RedYellowBlue",
"SaddlebackHot",
"Spectrum"
"Spectrum",
],
colorMapSelect: "",
colorMapSelect: "WhiteBlack",
_colorMap: "",
pipeline: null,
_seismicWidget: null,
......@@ -303,34 +524,37 @@ export default {
NormalizationBl: 0.1,
NormalizationTypeData: [
{
"label": "None",
"value": 0,
label: "None",
value: 0,
},
{
"label": "Maximum",
"value": 1,
label: "Maximum",
value: 1,
},
{
"label": "TraceMaximum",
"value": 2,
label: "TraceMaximum",
value: 2,
},
{
"label": "Average",
"value": 3,
label: "Average",
value: 3,
},
{
"label": "TraceAverage",
"value": 4,
}, {
"label": "RMS",
"value": 5,
}, {
"label": "TraceRMS",
"value": 6,
}, {
"label": "Limits",
"value": 7,
}
label: "TraceAverage",
value: 4,
},
{
label: "RMS",
value: 5,
},
{
label: "TraceRMS",
value: 6,
},
{
label: "Limits",
value: 7,
},
],
mycds: null,
msycs: null,
......@@ -340,33 +564,39 @@ export default {
tracesEdge: null,
InterpolationType: [
{
"label": "Linear",
"value": 1,
}, {
"label": "Quadratic",
"value": 2,
}, {
"label": "Step",
"value": 3,
}, {
"label": "CenteredStep",
"value": 4,
}, {
"label": "Cubic",
"value": 5,
}, {
"label": "Logarithmic",
"value": 6,
label: "Linear",
value: 1,
},
{
label: "Quadratic",
value: 2,
},
{
label: "Step",
value: 3,
},
{
label: "CenteredStep",
value: 4,
},
{
label: "Cubic",
value: 5,
},
{
label: "Logarithmic",
value: 6,
},
],
InterpolationEdge: [
{
"label": "Zero",
"value": 0,
}, {
"label": "Duplicate",
"value": 1,
}
label: "Zero",
value: 0,
},
{
label: "Duplicate",
value: 1,
},
],
Wiggle: false,
Reversed: false,
......@@ -382,11 +612,12 @@ export default {
ClippingMode: null,
ClippingModeData: [
{
"label": "Connected",
"value": "Connected"
}, {
"label": "Disconnected",
"value": "Disconnected"
label: "Connected",
value: "Connected",
},
{
label: "Disconnected",
value: "Disconnected",
},
],
TaperFilterEnbled: false,
......@@ -405,75 +636,124 @@ export default {
Step: 1,
Units: "",
WindowLength: 250,
colorProvider: null,
UnitsData: [
{
"label": "Sample",
"value": 0
}, {
"label": "Time",
"value": 1
label: "Sample",
value: 0,
},
{
label: "Time",
value: 1,
},
],
NoiseReductionData: [
{
"label": "disable",
"value": "disable"
}, {
"label": "enable",
"value": "enable"
}, {
"label": "auto",
"value": "auto"
label: "disable",
value: "disable",
},
{
label: "enable",
value: "enable",
},
{
label: "auto",
value: "auto",
},
],
ReverseEnbled: false,
inverted: false,
reversed: false,
// 文件上传相关
uploadUrl: process.env.VUE_APP_BASE_API + '/ndy/dz/upload',
uploadUrl: process.env.VUE_APP_BASE_API + "/ndy/dz/upload",
uploadHeaders: {
Authorization: "Bearer " + getToken()
Authorization: "Bearer " + getToken(),
},
fileList: []
}
fileList: [],
};
},
mounted() {
// this.init()
this.init()
},
methods: {
init() {
//创建
seismicPlot = new SeismicPlot({
'canvas': this.$refs.plot,
'errorCallback': this.onCreateWidgetError,
'fileOpenedCallback': this.onFileOpen
canvas: this.$refs.plot,
errorCallback: this.onCreateWidgetError,
fileOpenedCallback: this.onFileOpen,
});
this.handleFileSelect()
// 不再自动加载默认文件,等待用户上传文件
},
// 添加注册颜色映射的方法
registerColorMaps() {
var colorProvider=SeismicColors.getDefault();
if (!colorProvider) {
console.error('colorProvider为空,无法注册颜色映射');
return;
}
try {
// 注册多段颜色渐变(仅修改内部逻辑,保持原有结构)
colorProvider.register('ces', (map) => {
if (!map) {
console.error('BlueWhiteRed映射对象为空');
return;
}
const colors = new Array(256);
try {
const colorStops = [
{ idx: 0, color: { R: 254, G: 70, B: 80 } },
{ idx: 127, color: { R: 255, G: 255, B: 255 } },
{ idx: 255, color: { R: 30, G: 45, B: 255 } }
];
// 逐段插值,匹配图片的颜色过渡
interpolate2(colors, colorStops[0].idx, colorStops[1].idx, colorStops[0].color, colorStops[1].color);
interpolate2(colors, colorStops[1].idx, colorStops[2].idx, colorStops[1].color, colorStops[2].color);
map.set(colors);
} catch (error) {
console.error('设置BlueWhiteRed颜色映射失败:', error);
}
});
console.log('颜色映射注册成功');
} catch (error) {
console.error('注册颜色映射失败:', error);
}
},
handleFileSelect() {
let url = process.env.VUE_APP_BASE_API + "/ndy/dz/getSegyDataFile3?fileName=density.segy";
let fileName = 'density.segy';
let url = process.env.VUE_APP_BASE_API + "/ndy/dz/getSegyDataFile?fileName=density.segy";
let fileName = "density.segy";
return fetch(url, {
headers: {
Authorization: "Bearer " + getToken()
}
}).then((response) => {
Authorization: "Bearer " + getToken(),
},
})
.then((response) => {
if (!response.ok) {
throw new Error(`网络请求失败: ${response.status} ${response.statusText}`);
throw new Error(
`网络请求失败: ${response.status} ${response.statusText}`
);
}
return response.blob();
}).then((blob) => {
})
.then((blob) => {
if (!blob || blob.size === 0) {
throw new Error('获取到的文件数据为空');
throw new Error("获取到的文件数据为空");
}
let fileInput = new File([blob], fileName, { type: blob.type, lastModified: Date.now() });
let fileInput = new File([blob], fileName, {
type: blob.type,
lastModified: Date.now(),
});
// seismicPlot.createWidgetFromFile(filesObj)
const file = new LocalFile(fileInput);
this._fileSize = file.fileSize;
......@@ -485,17 +765,30 @@ export default {
}
// this.createRemotePipeline(reader)
reader.readDataSetStatistics((reader, statistics) => {
if (reader.getModelLimits().getHeight() === 0 && this.warningCallback != null) {
if (
reader.getModelLimits().getHeight() === 0 &&
this.warningCallback != null
) {
return this.$message.error("加载失败");
}
// return this.createPipelineFromFile(file.getFileName(), reader, statistics);
this.pipeline = new SeismicPipeline(file.getFileName(), reader, statistics)
seismicPlot.createPipelineFromFile2(this.pipeline, file.getFileName(), reader, statistics);
console.log(this.pipeline)
this.pipeline = new SeismicPipeline(
file.getFileName(),
reader,
statistics
);
seismicPlot.createPipelineFromFile2(
this.pipeline,
file.getFileName(),
reader,
statistics
);
console.log(this.pipeline);
console.log(this.pipeline.getStatistics());
});
});
})
this.registerColorMaps()
});
},
onCreateWidgetError(errorMsg) {
this.$message.error(errorMsg);
......@@ -518,21 +811,26 @@ export default {
this.showPropertiesDialog = false;
},
onFileOpen() {
},
onFileOpen() {},
changeColor(val) {
var colorMap = SeismicColors.getDefault().createNamedColorMap(val, 256)
var colorMap = SeismicColors.getDefault().createNamedColorMap(val, 256);
console.log(this.pipeline)
this.pipeline.setColorMap(colorMap);
this.pipeline.getColorMap().setAlpha(230)
console.log(this.pipeline.getColorMap())
console.log(this.pipeline.getColorMap().getColor(1841))
console.log(this.pipeline.getColorMap().getMinValue())
console.log(this.pipeline.getColorMap().getMaxValue())
if (seismicPlot._seismicWidget) {
seismicPlot._seismicWidget.invalidate(); // 使组件重新渲染
seismicPlot._seismicWidget.fitToBounds(); // 调整视图以适应数据
} else {
console.error('Widget不可用,无法更新视图');
console.error("Widget不可用,无法更新视图");
}
// 如果plots对象存在redraw方法,使用它来触发重绘
if (seismicPlot.plots && typeof seismicPlot.plots.redraw === 'function') {
if (seismicPlot.plots && typeof seismicPlot.plots.redraw === "function") {
seismicPlot.plots.redraw();
}
},
......@@ -540,101 +838,100 @@ export default {
changeNor(val) {
if (this.NormalizationType == 7) {
this.pipeline.setOptions({
'normalization': {
'type': this.NormalizationType,
'scale': this.NormalizationBl
}
})
normalization: {
type: this.NormalizationType,
scale: this.NormalizationBl,
},
});
} else {
this.pipeline.setOptions({
'normalization': {
'type': this.NormalizationType,
'scale': this.NormalizationBl
}
})
normalization: {
type: this.NormalizationType,
scale: this.NormalizationBl,
},
});
}
},
changeMycds() {
seismicPlot.openPipeline(this.pipeline, {
'tracescale': this.mycds,
'samplescale': this.msycs,
'deviceunit': 'in',
'sampleunit': 's',
tracescale: this.mycds,
samplescale: this.msycs,
deviceunit: "in",
sampleunit: "s",
});
},
changeInt() {
console.log(this.pipeline.getOptions())
console.log(this.pipeline.getOptions());
this.pipeline.setOptions({
'interpolation': {
'samples': {
"type": this.samplesType,//采样插值类型,
"edge": this.samplesEdge,//采样插值边缘,
interpolation: {
samples: {
type: this.samplesType, //采样插值类型,
edge: this.samplesEdge, //采样插值边缘,
},
'traces': {
"type": this.tracesType,//道插值类型
"edge": this.tracesEdge,//道插值边缘
traces: {
type: this.tracesType, //道插值类型
edge: this.tracesEdge, //道插值边缘
},
}
})
},
});
},
changePlotType() {
this.pipeline.setOptions({
'plot': {
'type': {
"Wiggle": this.Wiggle,
"Reversed": this.Reversed,
"PositiveFill": this.PositiveFill,
"NegativeFill": this.NegativeFill,
"PositiveColorFill": this.PositiveColorFill,
"NegativeColorFill": this.NegativeColorFill,
"SimpleDensity": this.SimpleDensity,
"InterpolatedDensity": this.InterpolatedDensity,
},
"clippingFactor": this.ClippingFactor,
"decimationSpacing": this.DecimationSpacing,
"densityDecimation": this.densityDecimation,
},
"clippingmode": this.ClippingMode,
"dataProcessors": {
"TaperFilter": {
"apply": this.TaperFilterEnbled,
"f1": Number(this.f1),
"f2": Number(this.f2),
"f3": Number(this.f3),
"f4": Number(this.f4),
"sampleRate": Number(this.sampleRate),
"passFlag": this.passFlag,
},
"AGC": {
"agcLength": this.AGCLength,
"apply": this.AGCEnbled,
"desiredAverage": this.DesiredAverage,
"noiseReduction": this.NoiseReduction,
"noiseReductionPercentage": this.NoiseReductionPercentage,
"startSample": this.StartSample,
"step": this.Step,
"units": this.Units,
"windowLength": this.WindowLength,
},
"Reverse": {
"apply": this.ReverseEnbled,
"inverted": this.inverted,
"reversed": this.reversed,
}
}
})
plot: {
type: {
Wiggle: this.Wiggle,
Reversed: this.Reversed,
PositiveFill: this.PositiveFill,
NegativeFill: this.NegativeFill,
PositiveColorFill: this.PositiveColorFill,
NegativeColorFill: this.NegativeColorFill,
SimpleDensity: this.SimpleDensity,
InterpolatedDensity: this.InterpolatedDensity,
},
clippingFactor: this.ClippingFactor,
decimationSpacing: this.DecimationSpacing,
densityDecimation: this.densityDecimation,
},
clippingmode: this.ClippingMode,
dataProcessors: {
TaperFilter: {
apply: this.TaperFilterEnbled,
f1: Number(this.f1),
f2: Number(this.f2),
f3: Number(this.f3),
f4: Number(this.f4),
sampleRate: Number(this.sampleRate),
passFlag: this.passFlag,
},
AGC: {
agcLength: this.AGCLength,
apply: this.AGCEnbled,
desiredAverage: this.DesiredAverage,
noiseReduction: this.NoiseReduction,
noiseReductionPercentage: this.NoiseReductionPercentage,
startSample: this.StartSample,
step: this.Step,
units: this.Units,
windowLength: this.WindowLength,
},
Reverse: {
apply: this.ReverseEnbled,
inverted: this.inverted,
reversed: this.reversed,
},
},
});
console.log(this.pipeline.getOptions())
console.log(this.pipeline.getOptions());
},
// 文件上传相关方法
triggerFileUpload() {
// 创建隐藏的文件输入元素
const input = document.createElement('input');
input.type = 'file';
input.accept = '.segy,.sgy';
input.style.display = 'none';
const input = document.createElement("input");
input.type = "file";
input.accept = ".segy,.sgy";
input.style.display = "none";
input.onchange = (event) => {
const file = event.target.files[0];
......@@ -650,71 +947,84 @@ export default {
handleFileUpload(file) {
// 检查文件类型
const allowedTypes = ['.segy', '.sgy'];
const allowedTypes = [".segy", ".sgy"];
const fileName = file.name.toLowerCase();
const isValidType = allowedTypes.some(type => fileName.endsWith(type));
const isValidType = allowedTypes.some((type) => fileName.endsWith(type));
if (!isValidType) {
this.$message.error('只能上传segy、sgy文件');
this.$message.error("只能上传segy、sgy文件");
return;
}
// 检查文件大小 (例如限制为100MB)
const maxSize = 100 * 1024 * 1024; // 100MB
if (file.size > maxSize) {
this.$message.error('文件大小不能超过100MB');
this.$message.error("文件大小不能超过100MB");
return;
}
// 创建FormData
const formData = new FormData();
formData.append('file', file);
formData.append("file", file);
// 上传文件
this.$message.info('正在上传文件...');
this.$message.info("正在上传文件...");
fetch(this.uploadUrl, {
method: 'POST',
method: "POST",
headers: this.uploadHeaders,
body: formData
body: formData,
})
.then(response => {
.then((response) => {
if (!response.ok) {
throw new Error(`上传失败: ${response.status} ${response.statusText}`);
throw new Error(
`上传失败: ${response.status} ${response.statusText}`
);
}
return response.json();
})
.then(data => {
this.$message.success('文件上传成功');
console.log('上传成功:', data);
.then((data) => {
this.$message.success("文件上传成功");
console.log("上传成功:", data);
// 这里可以处理上传成功后的逻辑,比如重新加载数据
this.loadNewFile(data.fileName);
this.init()
this.registerColorMaps()
this.init();
})
.catch(error => {
console.error('上传失败:', error);
this.$message.error('文件上传失败: ' + error.message);
.catch((error) => {
console.error("上传失败:", error);
this.$message.error("文件上传失败: " + error.message);
});
},
loadNewFile(fileName) {
// 加载新文件的逻辑
let url = process.env.VUE_APP_BASE_API + "/ndy/dz/getSegyDataFile3?fileName=" + fileName;
let url =
process.env.VUE_APP_BASE_API +
"/ndy/dz/getSegyDataFile3?fileName=" +
fileName;
return fetch(url, {
headers: {
Authorization: "Bearer " + getToken()
}
}).then((response) => {
Authorization: "Bearer " + getToken(),
},
})
.then((response) => {
if (!response.ok) {
throw new Error(`网络请求失败: ${response.status} ${response.statusText}`);
throw new Error(
`网络请求失败: ${response.status} ${response.statusText}`
);
}
return response.blob();
}).then((blob) => {
})
.then((blob) => {
if (!blob || blob.size === 0) {
throw new Error('获取到的文件数据为空');
throw new Error("获取到的文件数据为空");
}
let fileInput = new File([blob], fileName, { type: blob.type, lastModified: Date.now() });
let fileInput = new File([blob], fileName, {
type: blob.type,
lastModified: Date.now(),
});
const file = new LocalFile(fileInput);
this._fileSize = file.fileSize;
const segyReader = new SegyReader(file);
......@@ -724,22 +1034,30 @@ export default {
return;
}
reader.readDataSetStatistics((reader, statistics) => {
if (reader.getModelLimits().getHeight() === 0 && this.warningCallback != null) {
if (
reader.getModelLimits().getHeight() === 0 &&
this.warningCallback != null
) {
return this.$message.error("加载失败");
}
this.pipeline = new SeismicPipeline(fileName, reader, statistics)
seismicPlot.createPipelineFromFile2(this.pipeline, fileName, reader, statistics);
console.log(this.pipeline)
this.pipeline = new SeismicPipeline(fileName, reader, statistics);
seismicPlot.createPipelineFromFile2(
this.pipeline,
fileName,
reader,
statistics
);
console.log(this.pipeline);
});
});
}).catch(error => {
console.error('加载文件失败:', error);
this.$message.error('加载文件失败: ' + error.message);
})
.catch((error) => {
console.error("加载文件失败:", error);
this.$message.error("加载文件失败: " + error.message);
});
}
}
}
},
},
};
</script>
<style scoped>
......
......@@ -319,6 +319,52 @@ const interpolate = function (target, startIndex, endIndex, startColor, endColor
}
};
// 注:interpolate函数需保持原有实现(线性插值保证平滑)
function interpolate2(target, startIndex, endIndex, startColor, endColor) {
// 添加参数验证
if (!target || !Array.isArray(target)) {
console.error('interpolate: target必须是数组');
return;
}
if (typeof startIndex !== 'number' || typeof endIndex !== 'number' ||
startIndex < 0 || endIndex >= target.length || startIndex > endIndex) {
console.error(`interpolate: 索引无效 - startIndex: ${startIndex}, endIndex: ${endIndex}, target.length: ${target.length}`);
return;
}
if (!startColor || !endColor ||
typeof startColor.R !== 'number' || typeof startColor.G !== 'number' || typeof startColor.B !== 'number' ||
typeof endColor.R !== 'number' || typeof endColor.G !== 'number' || typeof endColor.B !== 'number') {
console.error('interpolate: 颜色必须包含有效的RGB值');
return;
}
const offset = startIndex;
const stop = (endIndex - startIndex);
let r, g, b;
const stepR = (endColor.R - startColor.R) / (stop);
const stepG = (endColor.G - startColor.G) / (stop);
const stepB = (endColor.B - startColor.B) / (stop);
try {
for (let i = 0; i <= stop; ++i) {
r = startColor.R + i * stepR;
g = startColor.G + i * stepG;
b = startColor.B + i * stepB;
target[offset + i] = new RgbaColor(
Math.round(r < 255 ? r : 255),
Math.round(g < 255 ? g : 255),
Math.round(b < 255 ? b : 255),
255
);
}
} catch (error) {
console.error(`interpolate: 创建颜色时出错 - ${error.message}`);
}
}
export default {
name: "seismic",
components: {
......@@ -2000,6 +2046,74 @@ export default {
});
// 注册多段颜色渐变
// colorProvider.register('BlueWhiteRed', (map) => {
// if (!map) {
// console.error('BlueWhiteRed映射对象为空');
// return;
// }
//
// const colors = new Array(256);
//
// try {
// // 第一段:253, 27, 21 到 255, 205, 203 (0-63)
// interpolate(colors, 0, 63, {
// A: 255,
// R: 254,
// G: 13,
// B: 6
// }, {
// A: 255,
// R: 255,
// G: 205,
// B: 203
// });
//
// // 第二段:255, 205, 203 到 255, 251, 251 (64-127)
// interpolate(colors, 64, 127, {
// A: 255,
// R: 255,
// G: 205,
// B: 203
// }, {
// A: 255,
// R: 255,
// G: 251,
// B: 251
// });
//
// // 第三段:255, 251, 251 到 206, 207, 255 (128-191)
// interpolate(colors, 128, 191, {
// A: 255,
// R: 255,
// G: 251,
// B: 251
// }, {
// A: 255,
// R: 206,
// G: 207,
// B: 255
// });
//
// // 第四段:206, 207, 255 到 30, 38, 253 (192-255)
// interpolate(colors, 192, 255, {
// A: 255,
// R: 206,
// G: 207,
// B: 255
// }, {
// A: 255,
// R: 9,
// G: 25,
// B: 254
// });
//
// map.set(colors);
// } catch (error) {
// console.error('设置BlueWhiteRed颜色映射失败:', error);
// }
// });
// 注册多段颜色渐变(仅修改内部逻辑,保持原有结构)
colorProvider.register('BlueWhiteRed', (map) => {
if (!map) {
console.error('BlueWhiteRed映射对象为空');
......@@ -2009,65 +2123,23 @@ export default {
const colors = new Array(256);
try {
// 第一段:253, 27, 21 到 255, 205, 203 (0-63)
interpolate(colors, 0, 63, {
A: 255,
R: 254,
G: 13,
B: 6
}, {
A: 255,
R: 255,
G: 205,
B: 203
});
// 第二段:255, 205, 203 到 255, 251, 251 (64-127)
interpolate(colors, 64, 127, {
A: 255,
R: 255,
G: 205,
B: 203
}, {
A: 255,
R: 255,
G: 251,
B: 251
});
// 第三段:255, 251, 251 到 206, 207, 255 (128-191)
interpolate(colors, 128, 191, {
A: 255,
R: 255,
G: 251,
B: 251
}, {
A: 255,
R: 206,
G: 207,
B: 255
});
// 第四段:206, 207, 255 到 30, 38, 253 (192-255)
interpolate(colors, 192, 255, {
A: 255,
R: 206,
G: 207,
B: 255
}, {
A: 255,
R: 9,
G: 25,
B: 254
});
// 定义核心颜色节点
const redColor = { A: 255, R: 254, G: 13, B: 6 }; // 起始红色
const whiteColor = { A: 255, R: 255, G: 255, B: 255 }; // 中间纯白
const blueColor = { A: 255, R: 9, G: 25, B: 254 }; // 最终蓝色
// 按100个颜色段的节奏拆分0-255区间,保证渐变平滑
// 第一段:红→白(0-127,约50个核心渐变段)
interpolate2(colors, 0, 127, redColor, whiteColor);
// 第二段:白→蓝(128-255,约50个核心渐变段)
interpolate2(colors, 128, 255, whiteColor, blueColor);
console.log(colors)
map.set(colors);
} catch (error) {
console.error('设置BlueWhiteRed颜色映射失败:', error);
}
});
console.log('颜色映射注册成功');
} catch (error) {
console.error('注册颜色映射失败:', error);
......
......@@ -575,6 +575,51 @@ const interpolate = function (target, startIndex, endIndex, startColor, endColor
console.error(`interpolate: 创建颜色时出错 - ${error.message}`);
}
};
function interpolate2 (target, startIndex, endIndex, startColor, endColor) {
// 添加参数验证
if (!target || !Array.isArray(target)) {
console.error('interpolate: target必须是数组');
return;
}
if (typeof startIndex !== 'number' || typeof endIndex !== 'number' ||
startIndex < 0 || endIndex >= target.length || startIndex > endIndex) {
console.error(`interpolate: 索引无效 - startIndex: ${startIndex}, endIndex: ${endIndex}, target.length: ${target.length}`);
return;
}
if (!startColor || !endColor ||
typeof startColor.R !== 'number' || typeof startColor.G !== 'number' || typeof startColor.B !== 'number' ||
typeof endColor.R !== 'number' || typeof endColor.G !== 'number' || typeof endColor.B !== 'number') {
console.error('interpolate: 颜色必须包含有效的RGB值');
return;
}
const offset = startIndex;
const stop = (endIndex - startIndex);
let r, g, b;
const stepR = (endColor.R - startColor.R) / (stop);
const stepG = (endColor.G - startColor.G) / (stop);
const stepB = (endColor.B - startColor.B) / (stop);
try {
for (let i = 0; i <= stop; ++i) {
r = startColor.R + i * stepR;
g = startColor.G + i * stepG;
b = startColor.B + i * stepB;
target[offset + i] = new RgbaColor(
Math.round(r < 255 ? r : 255),
Math.round(g < 255 ? g : 255),
Math.round(b < 255 ? b : 255),
255
);
}
} catch (error) {
console.error(`interpolate: 创建颜色时出错 - ${error.message}`);
}
}
export default {
name: "YsgcIndex2",
components: {
......@@ -7831,8 +7876,8 @@ export default {
}
});
// 注册多段颜色渐变
colorProvider.register('BlueWhiteRed', (map) => {
// 注册多段颜色渐变(仅修改内部逻辑,保持原有结构)
colorProvider.register('RedWhiteBlue', (map) => {
if (!map) {
console.error('BlueWhiteRed映射对象为空');
return;
......@@ -7841,58 +7886,15 @@ export default {
const colors = new Array(256);
try {
// 第一段:253, 27, 21 到 255, 205, 203 (0-63)
interpolate(colors, 0, 63, {
A: 255,
R: 254,
G: 13,
B: 6
}, {
A: 255,
R: 255,
G: 205,
B: 203
});
// 第二段:255, 205, 203 到 255, 251, 251 (64-127)
interpolate(colors, 64, 127, {
A: 255,
R: 255,
G: 205,
B: 203
}, {
A: 255,
R: 255,
G: 251,
B: 251
});
// 第三段:255, 251, 251 到 206, 207, 255 (128-191)
interpolate(colors, 128, 191, {
A: 255,
R: 255,
G: 251,
B: 251
}, {
A: 255,
R: 206,
G: 207,
B: 255
});
// 第四段:206, 207, 255 到 30, 38, 253 (192-255)
interpolate(colors, 192, 255, {
A: 255,
R: 206,
G: 207,
B: 255
}, {
A: 255,
R: 9,
G: 25,
B: 254
});
const colorStops = [
{ idx: 0, color: { R: 254, G: 70, B: 80 } },
{ idx: 127, color: { R: 255, G: 255, B: 255 } },
{ idx: 255, color: { R: 30, G: 45, B: 255 } }
];
// 逐段插值,匹配图片的颜色过渡
interpolate2(colors, colorStops[0].idx, colorStops[1].idx, colorStops[0].color, colorStops[1].color);
interpolate2(colors, colorStops[1].idx, colorStops[2].idx, colorStops[1].color, colorStops[2].color);
map.set(colors);
} catch (error) {
console.error('设置BlueWhiteRed颜色映射失败:', error);
......@@ -8875,7 +8877,7 @@ export default {
changeColor(val) {
var colorMap = SeismicColors.getDefault().createNamedColorMap(val, 256)
this.pipeline.setColorMap(colorMap);
this.pipeline.getColorMap().setAlpha(230)
console.log(this.plots)
if (this._seismicWidget) {
this._seismicWidget.invalidate(); // 使组件重新渲染
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment