!2611 新增:增加自动设置孔面命令配置,设置不受分界高度影响的排钻类型

pull/2659/head
钱若寒 6 months ago committed by ChenX
parent eb921eab79
commit 87b7379013

@ -1,32 +1,31 @@
import { observable, toJS } from "mobx";
import { app } from "../ApplicationServices/Application";
import { EBoardKeyList } from "../Common/BoardKeyList";
import { LogType } from "../Common/Log";
import { DataAdapter } from "../Common/DataAdapter";
import { Singleton } from "../Common/Singleton";
import { safeEval } from "../Common/eval";
import { Board } from "../DatabaseServices/Entity/Board";
import { BoardType } from "../DatabaseServices/Entity/BoardInterface";
import { Command } from "../Editor/CommandMachine";
import { PromptStatus } from "../Editor/PromptResult";
import { BoardModalType } from "../UI/Components/Board/BoardModalType";
import { IConfigOption } from "../UI/Components/Board/UserConfigComponent";
import { FilterDrillModal } from "../UI/Components/FilterDrillModal";
import { ModalState } from "../UI/Components/Modal/ModalInterface";
import { IConfigStore } from "../UI/Store/BoardStore";
import { userConfigStore } from "../UI/Store/UserConfigStore";
import { IAutoHoleFaceOption, IUiOption } from "../UI/Store/OptionInterface/IOptionInterface";
import { FaceDirection } from "./DrawDrilling/DrillType";
export class AutoHoleFaceSetting implements Command
{
store: AutoHoleFaceSettingStore;
async exec()
{
if (!this.store)
{
this.store = new AutoHoleFaceSettingStore;
await userConfigStore.UpdateBoardOption(this.store.configName, BoardModalType.AutoHoleFaceSetting, this.store);
}
while (true)
let store = AutoHoleFaceSettingStore.GetInstance();
app.Editor.ModalManage.RenderModal(FilterDrillModal, { store });
let state = await app.Editor.ModalManage.Wait();
if (state.Status === ModalState.Ok)
{
let brRes = await app.Editor.GetSelection({
Msg: "选择需要设置孔面的板件(分界高度" + this.store.config.option.hight + ")",
KeyWordList: [{ msg: "重新设置高度输入:", key: "H" }],
Msg: "选择需要设置孔面的板件(分界高度" + store.option.hight + ")",
UseSelect: true,
Filter: {
filterFunction: (o, e) =>
@ -42,55 +41,70 @@ export class AutoHoleFaceSetting implements Command
for (let br of brs)
{
let p = br.Position;
if (p.z > this.store.config.option.hight)
if (p.z > store.option.hight &&
!store.option.filterDrill.includes(br.BoardProcessOption[EBoardKeyList.DrillType])
)
br.BoardProcessOption[EBoardKeyList.BigHole] = FaceDirection.Front;
else
br.BoardProcessOption[EBoardKeyList.BigHole] = FaceDirection.Back;
}
return;
}
if (brRes.Status === PromptStatus.Keyword)
if (brRes.StringResult === "H")
{
let ret = await app.Editor.GetDistance({ Msg: "当前规定高度为:", Default: this.store.config.option.hight });
if (ret.Status === PromptStatus.OK)
{
if (ret.Distance <= 0 || isNaN(ret.Distance))
{
app.Editor.Prompt("请输入为正数的高度!", LogType.Warning);
}
this.store.config.option.hight = Math.abs(ret.Distance);
userConfigStore.SaveConfig(BoardModalType.AutoHoleFaceSetting, this.store, { toaster: false });
}
}
}
}
}
//只是用来保存配置
class AutoHoleFaceSettingStore implements IConfigStore
export class AutoHoleFaceSettingStore extends Singleton implements IConfigStore
{
configName = "默认";
configsNames = ['默认'];
config = {
option: {
hight: 1500
}
@observable configName = "默认";
@observable configsNames = ['默认'];
@observable option: IAutoHoleFaceOption = {
version: 1,
hight: 1500,
filterDrill: ''
};
@observable uiOption: IUiOption<IAutoHoleFaceOption>;
InitOption()
{
this.config = {
option: {
hight: 1500
}
};
Object.assign(this.option, {
version: 1,
hight: 1500,
filterDrill: ''
});
}
get UiOption()
{
if (!this.uiOption)
this.uiOption = DataAdapter.ConvertUIData(this.option);
return this.uiOption;
}
SaveConfig()
{
return this.config;
let newConfig: IConfigOption<IAutoHoleFaceOption> = {};
newConfig.option = toJS(this.option);
return newConfig;
}
UpdateOption(conf: IConfigOption<any>)
{
Object.assign(this.config, conf);
this.option.hight = conf.option.hight;
if (!conf.option.version)
{
conf.option.version = 1;
conf.option.filterDrill = '';
}
this.option.filterDrill = conf.option.filterDrill;
if (this.uiOption)
Object.assign(this.uiOption, DataAdapter.ConvertUIData(conf.option));
}
HasInvailValue()
{
let flag = "";
if (isNaN(safeEval(this.uiOption.hight)))
flag = "分界高度只能设置为数字";
return flag;
}
}

@ -0,0 +1,190 @@
import { Button, Checkbox, Classes, Intent, Label, Position, Tooltip } from "@blueprintjs/core";
import { toJS } from "mobx";
import { observer } from "mobx-react";
import React, { useState } from "react";
import { AutoHoleFaceSettingStore } from "../../Add-on/AutoHoleFaceSetting";
import { app } from "../../ApplicationServices/Application";
import { CheckObjectType } from "../../Common/CheckoutVaildValue";
import { LogType } from "../../Common/Log";
import { PromptStatus } from "../../Editor/PromptResult";
import { userConfig } from "../../Editor/UserConfig";
import "../Css/filterDrillModal.less";
import { SetBoardDataItem } from "./Board/BoardCommon";
import { BoardModalType } from "./Board/BoardModalType";
import { Config_ModalType } from "./Board/UserConfigComponent";
import { CommonModal } from "./Modal/ModalContainer";
import { ModalState } from "./Modal/ModalInterface";
import { ToasterValueError } from "./Toaster";
export const FilterDrillModal = (observer((props: { store?: AutoHoleFaceSettingStore; }) =>
{
const store = props.store;
const [filterDrillArray, setFilterDrillArray] = useState([]);
let drillArray = [...(userConfig.DrillConfigs.keys())];
const inputDrillStr = store.option.filterDrill;
const Ok = () =>
{
const errMsg = props.store.HasInvailValue();
if (errMsg)
{
ToasterValueError(errMsg);
return;
}
app.Editor.ModalManage.m_PromisRes({
Status: ModalState.Ok,
});
app.Editor.ModalManage.Destory();
};
const Close = () =>
{
app.Editor.ModalManage.Destory();
};
const getHeightValue = async () =>
{
app.Editor.ModalManage.ToggleShow();
app.Editor.MaskManage.Clear();
let ret = await app.Editor.GetDistance({ Msg: "点取距离或者输入" });
if (ret.Status === PromptStatus.OK)
{
if (ret.Distance <= 0 || isNaN(ret.Distance))
{
app.Editor.Prompt("请输入为正数的高度!", LogType.Warning);
}
let hight = Math.abs(Number(ret.Distance.toFixed(2)));
props.store.UpdateOption({ option: { hight: toJS(hight) } });
}
app.Editor.ModalManage.ToggleShow();
app.Editor.MaskManage.ShowMask();
};
const changeDrill = (item) =>
{
if (filterDrillArray.indexOf(item) === -1)
{
setFilterDrillArray([...filterDrillArray, item]);
}
else
{
let newFilterDrillArray = [...filterDrillArray];
newFilterDrillArray = newFilterDrillArray.filter(ele => ele !== item);
setFilterDrillArray(newFilterDrillArray);
}
};
const handleInputChange = (e) =>
{
const newValue = e.target.value;
let newValueString = '';
if (newValue.trim() !== '')
{
newValueString = newValue.trim();
}
store.option.filterDrill = newValueString;
};
const handleApplySelected = () =>
{
const newItems = filterDrillArray.filter(item => !inputDrillStr.includes(item));
let updatedInputDrillArray = inputDrillStr + (inputDrillStr && !inputDrillStr.endsWith(',') ? ',' : '') + newItems.join(',');
if (updatedInputDrillArray && !updatedInputDrillArray.endsWith(','))
{
updatedInputDrillArray += ',';
}
store.option.filterDrill = updatedInputDrillArray;
};
return (
<CommonModal
title="自动设置孔面"
close={() => Close()}
store={store}
configType={Config_ModalType.ConfigListModal}
type={BoardModalType.AutoHoleFaceSetting}
footerChildren={
<>
<Button
intent={Intent.SUCCESS}
text="确定"
onClick={() => Ok()}
/>
<Button
style={{ marginLeft: 3 }}
intent={Intent.DANGER}
text="取消"
onClick={() => Close()}
/>
</>
}
>
<div className="filterDrillModal-body bp3-card">
<div className="size-input">
<Label>
<SetBoardDataItem
titleStyle={{ width: "3rem" }}
type={CheckObjectType.OnlyNumber}
optKey={'hight'}
option={store.option}
uiOption={store.UiOption}
title={'高度'}
/>
</Label>
<Button
icon="arrow-right"
onClick={() => getHeightValue()}
/>
</div>
<h5></h5>
<div style={{ border: '1px solid #ccc', padding: '15px' }}>
<div style={{ minHeight: 200 }}>
<div className="drillModal-boder">
<div className="filterDrillModal-checkbox">
<div className="drillModal-title">
<Tooltip
position={Position.TOP}>
</Tooltip>
</div>
{
drillArray.map((item, index) => (
<div className="drill-list-info drill-border" key={index}>
<Checkbox checked={filterDrillArray.indexOf(item) !== -1}
onChange={() => changeDrill(item)}
/>
<div>
{item}
</div>
</div>
))
}
</div>
</div>
</div>
<div className="application-selected">
<Button
text="应用选中"
intent={Intent.PRIMARY}
onClick={() => handleApplySelected()}
/>
<span style={{ marginLeft: 5 }}></span>
</div>
<input
className={`${Classes.INPUT} filterDrill-input`}
style={{ height: '2.5rem' }}
value={store.option.filterDrill}
onChange={(e) => handleInputChange(e)}
/>
</div>
</div>
</CommonModal>);
}));

@ -0,0 +1,101 @@
#modal .filterDrillModal-body {
padding: 20px;
width: 300px;
h5 {
margin: 7px 0;
}
.size-input {
display: flex;
.bp3-label {
display: flex;
align-items: center;
margin-bottom: 0;
.br-set {
display: flex;
}
&>:first-child {
margin-bottom: 0;
display: flex;
align-items: center;
.bp3-popover-wrapper {
margin-top: 0;
input {
margin: 10px 0;
width: 6.5rem;
height: 24px;
line-height: 20px;
}
}
}
}
.bp3-button {
margin: 10px 0 10px 20px;
min-height: 10px;
width: 56px;
height: 24px;
}
}
.bp3-control {
margin-bottom: 0;
}
.filterDrillModal-checkbox {
min-height: 200px;
overflow-y: scroll;
max-height: 204px;
}
.drill-list-info {
border: 1px solid #ccc;
display: grid;
align-items: center;
grid-template-columns: 70px 1fr 0 0;
padding: 5px 0;
&> :nth-child(1) {
margin-left: 10px;
}
&> :nth-child(2) {
margin-left: 20px;
text-align: center;
}
}
.drillModal-title {
border: 1px solid #ccc;
padding: 5px 37px 5px 5px;
text-align: right;
}
.drillModal-boder {
border: 1px solid #ccc;
padding: 8px 0px 8px 8px;
}
.drill-list-info.drill-border {
border-top: none;
}
.filterDrill-input {
width: 100%;
height: 50px;
}
.bp3-input:not([type=search]) {
height: 2.5rem;
}
.application-selected {
margin: 12px 0;
}
}

@ -195,7 +195,7 @@ export interface IShinkOption extends IBaseOption
back: number;
isLREqual: boolean;
isFBEqual: boolean;
isDrill:boolean;
isDrill: boolean;
}
export type IUiOption<T> = {
@ -341,3 +341,10 @@ export interface DoorRelatesInfoOption extends IBaseOption
{
hingeOption: [string, boolean][];
}
// 自动设置孔面设置
export interface IAutoHoleFaceOption extends IBaseOption
{
hight: number;
filterDrill: string; //被过滤的排钻
}

Loading…
Cancel
Save