一键生成车次窗--初提交

This commit is contained in:
joylink_zhaoerwei 2023-06-19 14:18:09 +08:00
parent b3c31c2a54
commit 8b46178f57
6 changed files with 112 additions and 60 deletions

View File

@ -16,57 +16,37 @@
lazy-rules
autogrow
/>
<div>
<q-input
outlined
label="生成车次窗数量"
v-model.number="generateParams.count"
type="number"
:rules="[(val) => val > 0 || '生成数量需要大于0']"
/>
<q-input
outlined
label="车次窗间隔"
v-model.number="generateParams.interval"
type="number"
hint=""
/>
<q-list bordered class="rounded-borders">
<q-item-label header>生成方向</q-item-label>
<q-list bordered separator class="rounded-borders">
<q-item>
<q-item-section no-wrap>
<div class="q-gutter-sm">
<q-radio v-model="generateParams.pd" :val="0" label="左侧" />
<q-radio v-model="generateParams.pd" :val="1" label="右侧" />
<q-item-section no-wrap class="q-gutter-y-sm column">
<q-item-label> 关联的区段 </q-item-label>
<div class="q-gutter-sm row">
<q-chip
v-for="item in relatedProcessPositions"
:key="item.id"
square
color="primary"
text-color="white"
>
{{ item.id }}
</q-chip>
</div>
</q-item-section>
</q-item>
</q-list>
<q-card-actions align="right">
<q-btn color="primary" label="生成" @click="onCreateTw" />
<q-btn label="取消" @click="redset" />
</q-card-actions>
</div>
</q-form>
</template>
<script setup lang="ts">
import { TrainWindowData } from 'src/drawApp/graphics/TrainWindowInteraction';
import { Section } from 'src/graphics/section/Section';
import { TrainWindow } from 'src/graphics/trainWindow/TrainWindow';
import {
GenerateParams,
TrainWindowDraw,
} from 'src/graphics/trainWindow/TrainWindowDrawAssistant';
import { useDrawStore } from 'src/stores/draw-store';
import { onMounted, reactive, watch } from 'vue';
import { computed, onMounted, reactive, watch } from 'vue';
const drawStore = useDrawStore();
const trainWindowModel = reactive(new TrainWindowData());
const generateParams = reactive({
count: 1,
interval: 5,
pd: 1,
});
drawStore.$subscribe;
watch(
@ -94,24 +74,13 @@ function onUpdate() {
}
}
function onCreateTw() {
if (generateParams.count <= 0) {
return;
const relatedProcessPositions = computed((): Section[] => {
if (
drawStore.selectedGraphic &&
drawStore.selectedGraphic.type === 'TrainWindow'
) {
return (drawStore.selectedGraphic as TrainWindow).getRelatedSections();
}
let params: GenerateParams = new GenerateParams(
generateParams.count,
generateParams.interval,
generateParams.pd > 0 ? true : false
);
const trainWindowDraw = drawStore
.getDrawApp()
.getDrawAssistant(TrainWindow.Type) as TrainWindowDraw;
trainWindowDraw.generates(drawStore.selectedGraphic as TrainWindow, params);
}
function redset() {
generateParams.count = 1;
generateParams.interval = 5;
generateParams.pd = 1;
}
return [];
});
</script>

View File

@ -31,6 +31,12 @@ export class TrainWindowData
set code(v: string) {
this.data.code = v;
}
get sectionId(): string {
return this.data.code;
}
set sectionId(v: string) {
this.data.code = v;
}
clone(): TrainWindowData {
return new TrainWindowData(this.data.cloneMessage());
}

View File

@ -1,14 +1,18 @@
import { Color, Graphics, Rectangle } from 'pixi.js';
import {
GraphicData,
GraphicRelationParam,
JlGraphic,
JlGraphicTemplate,
getRectangleCenter,
} from 'src/jl-graphic';
import { Section } from '../section/Section';
export interface ITrainWindowData extends GraphicData {
get code(): string; // 编号
set code(v: string);
get sectionId(): string; // 编号
set sectionId(v: string);
clone(): ITrainWindowData;
copyFrom(data: ITrainWindowData): void;
eq(other: ITrainWindowData): boolean;
@ -19,6 +23,7 @@ export const TrainWindowConsts = {
height: 15,
lineWidth: 2,
lineColor: '0x0fe81f',
offsetSection: 60,
};
export class TrainWindow extends JlGraphic {
@ -52,6 +57,21 @@ export class TrainWindow extends JlGraphic {
);
rectGraphic.pivot = getRectangleCenter(rectP);
}
loadRealtions(): void {
const sectionId = this.datas.sectionId;
const section = this.queryStore.queryById<Section>(sectionId);
if (section) {
this.relationManage.addRelation(
this,
new GraphicRelationParam(section, section.datas.id)
);
}
}
getRelatedSections(): Section[] {
return this.queryRelationByType('Section').map((rl) =>
rl.getOtherGraphic<Section>(this)
);
}
}
export class TrainWindowTemplate extends JlGraphicTemplate<TrainWindow> {

View File

@ -16,6 +16,7 @@ import {
TrainWindowTemplate,
TrainWindowConsts,
} from './TrainWindow';
import { Section } from '../section/Section';
export interface ITrainWindowDrawOptions {
newData: () => ITrainWindowData;
@ -99,6 +100,26 @@ export class TrainWindowDraw extends GraphicDrawAssistant<
}
this.storeGraphic(...trainWindows);
}
oneGenerates() {
const trainWindows: TrainWindow[] = [];
const sections = this.app.queryStore.queryByType<Section>(Section.Type);
sections.forEach((section) => {
const points = section.datas.points;
for (let i = 0; i < points.length - 1; i++) {
const x = (points[i].x + points[i + 1].x) / 2;
const trainWindow = new TrainWindow();
trainWindow.loadData(this.createGraphicData());
trainWindow.position.set(
x,
points[i].y - TrainWindowConsts.offsetSection
);
trainWindow.id = GraphicIdGenerator.next();
trainWindow.datas.sectionId = section.id;
trainWindows.push(trainWindow);
}
});
this.storeGraphic(...trainWindows);
}
}
//碰撞检测
@ -175,6 +196,7 @@ export class TrainWindowInteraction extends GraphicInteractionPlugin<TrainWindow
g.eventMode = 'none';
g.scalable = false;
g.rotatable = false;
g.off('selected', this.onSelected, this);
}
onSelected(): void {
this.app.setOptions({

View File

@ -15,6 +15,9 @@
<q-item clickable v-close-popup @click="buildRelations">
<q-item-section>一键关联</q-item-section>
</q-item>
<q-item clickable v-close-popup @click="oneClickGeneration">
<q-item-section>一键生成</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
@ -174,6 +177,8 @@ import { useRoute, useRouter } from 'vue-router';
import { errorNotify, successNotify } from 'src/utils/CommonNotify';
import { saveAsDraft } from 'src/api/DraftApi';
import { ApiError } from 'src/boot/axios';
import { TrainWindowDraw } from 'src/graphics/trainWindow/TrainWindowDrawAssistant';
import { TrainWindow } from 'src/graphics/trainWindow/TrainWindow';
const route = useRoute();
const router = useRouter();
@ -298,6 +303,13 @@ function buildRelations() {
console.log(app);
}
function oneClickGeneration() {
const trainWindowDraw = drawStore
.getDrawApp()
.getDrawAssistant(TrainWindow.Type) as TrainWindowDraw;
trainWindowDraw.oneGenerates();
}
function backConfirm() {
router.go(-1);
}

View File

@ -2052,6 +2052,7 @@ export namespace graphicData {
constructor(data?: any[] | {
common?: CommonInfo;
code?: string;
sectionId?: string;
}) {
super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
@ -2062,6 +2063,9 @@ export namespace graphicData {
if ("code" in data && data.code != undefined) {
this.code = data.code;
}
if ("sectionId" in data && data.sectionId != undefined) {
this.sectionId = data.sectionId;
}
}
}
get common() {
@ -2079,9 +2083,16 @@ export namespace graphicData {
set code(value: string) {
pb_1.Message.setField(this, 2, value);
}
get sectionId() {
return pb_1.Message.getFieldWithDefault(this, 3, "") as string;
}
set sectionId(value: string) {
pb_1.Message.setField(this, 3, value);
}
static fromObject(data: {
common?: ReturnType<typeof CommonInfo.prototype.toObject>;
code?: string;
sectionId?: string;
}): TrainWindow {
const message = new TrainWindow({});
if (data.common != null) {
@ -2090,12 +2101,16 @@ export namespace graphicData {
if (data.code != null) {
message.code = data.code;
}
if (data.sectionId != null) {
message.sectionId = data.sectionId;
}
return message;
}
toObject() {
const data: {
common?: ReturnType<typeof CommonInfo.prototype.toObject>;
code?: string;
sectionId?: string;
} = {};
if (this.common != null) {
data.common = this.common.toObject();
@ -2103,6 +2118,9 @@ export namespace graphicData {
if (this.code != null) {
data.code = this.code;
}
if (this.sectionId != null) {
data.sectionId = this.sectionId;
}
return data;
}
serialize(): Uint8Array;
@ -2113,6 +2131,8 @@ export namespace graphicData {
writer.writeMessage(1, this.common, () => this.common.serialize(writer));
if (this.code.length)
writer.writeString(2, this.code);
if (this.sectionId.length)
writer.writeString(3, this.sectionId);
if (!w)
return writer.getResultBuffer();
}
@ -2128,6 +2148,9 @@ export namespace graphicData {
case 2:
message.code = reader.readString();
break;
case 3:
message.sectionId = reader.readString();
break;
default: reader.skipField();
}
}