!1166 优化:新增拆单配置,超长提醒配置,自动翻转纹路配置

pull/1166/MERGE
ZoeLeeFZ 4 years ago committed by ChenX
parent 02d9cd1fa1
commit ba1ccc120c

@ -28,7 +28,7 @@ export class FeedingCommand implements Command
{
let feedingTool = FeedingToolPath.GetInstance() as FeedingToolPath;
let retCus = brs.map(br => feedingTool.TestCalcPath(br));
let retCus = brs.map(br => feedingTool.TestCalcPath(br, true));
let ptRes = await app.Editor.GetPoint({ Msg: "点取位置" });

@ -18,6 +18,7 @@ import { OrderDataBlock, WaveType } from "./Models/CadBlock";
import { ErpRouteInfo } from "./Models/ErpRouteInfo";
import { ErpRoutes } from "./Models/ErpRoutes";
import { ErpParseData } from "./ParseData";
import { checkInterfereTool } from "../../Common/InterfereUtil";
export class ChaiDan implements Command
{
@ -95,6 +96,22 @@ async function ExecChaiDan(chaiDanRoute: ErpRoutes)
{
let selction = await GetProductsEntitys();
if (!selction) return;
if (userConfig.chaidanOption.isCheckInterfere)
{
checkInterfereTool.Check([...selction.boardList, ...selction.metalsList]).then(objMap =>
{
if (objMap.size > 0)
{
AppToaster.show({
message: `${objMap.size}组实体干涉了,请退出检查确认`,
timeout: 3000,
intent: Intent.DANGER,
});
}
});
}
let store = BoardStore.GetInstance() as BoardStore;
let routeInfo: ErpRouteInfo;
let isNewErp = JSON.parse(localStorage.getItem(StoreageKeys.IsNewErp));
@ -198,8 +215,8 @@ function checkBlock(blockList: OrderDataBlock[]): { result: boolean, warnBlocks:
let goods = { length: userConfig.maxSize.height, width: userConfig.maxSize.width };
let msg: string = '';
let resultBlocks: OrderDataBlock[] = [];
let lengthdeflashing: number = 6; //长修边
let widthdeflashing: number = 6; //宽修边
let lengthdeflashing: number = userConfig.chaidanOption.changXiuBian; //长修边
let widthdeflashing: number = userConfig.chaidanOption.duanXiuBian;; //宽修边
blockList.forEach(block =>
{
let blockLength: number = block.KaiLiaoHeight; //开料长

@ -3,6 +3,7 @@ import { CADObject } from "./CADObject";
import { Board } from "./Entity/Board";
import { LinesType } from "../UI/Store/BoardInterface";
import { userConfig } from "../Editor/UserConfig";
import { AppConfirm } from "../UI/Components/Common/Confirm";
export class BoardLinesReactor
{
@ -10,11 +11,23 @@ export class BoardLinesReactor
{
app.CommandReactor.OnCommandEnd((cmdName: string, changeObjects: CADObject[], createObjects: CADObject[]) =>
{
let hasMaxSize = false;
for (let ent of changeObjects)
this.AutoChangeBoardLines(ent);
{
if (this.AutoChangeBoardLines(ent))
hasMaxSize = true;
}
for (let ent of createObjects)
this.AutoChangeBoardLines(ent);
if (this.AutoChangeBoardLines(ent))
hasMaxSize = true;
if (hasMaxSize && userConfig.maxSize.isShow)
{
AppConfirm.show({
message: "检测到有超长板件",
hasCancel: false,
});
}
});
}
@ -24,6 +37,7 @@ export class BoardLinesReactor
{
if (IsLong(ent))
{
if (!userConfig.autoLines) return true;
for (let line of lines)
{
if (!IsLong(ent, line))
@ -36,8 +50,10 @@ export class BoardLinesReactor
app.Editor.Prompt(`${ent.BoardProcessOption.boardName}超长,无法自动翻转!长:${ent.Height},宽:${ent.Width}.`);
if (ent.BoardProcessOption.lines !== LinesType.CanReversal)
ent.BoardProcessOption.lines = ent.Height > ent.Width ? LinesType.Positive : LinesType.Reverse;
return true;
}
}
return false;
}
}

@ -12,6 +12,7 @@ export interface IMaxSizeProps extends IBaseOption
{
height: number;
width: number;
isShow: boolean;
}
export interface ISystemConfig extends IBaseOption
@ -29,9 +30,10 @@ export interface ICursorConfig extends IBaseOption
export class UserConfig implements IConfigStore
{
private readonly _version = 8;
private readonly _version = 9;
_renderType: RenderType = RenderType.Wireframe;
@observable maxSize: IMaxSizeProps = {
isShow: false,
height: 2440,
width: 1220,
};
@ -42,7 +44,7 @@ export class UserConfig implements IConfigStore
@observable openExactDrill = true;
winerackConfig: IWineRackOption;
userConfigName: { [key: string]: string; } = {};
@observable modeling2HoleRad = 20; //圆造型小于等于该值拆成孔数据
private modeling2HoleRad = 20; //圆造型小于等于该值拆成孔数据
@observable isAdmin = false;
@observable kjlConfig: IGrooveOption = {
grooveAddLength: "0",
@ -67,6 +69,15 @@ export class UserConfig implements IConfigStore
@observable showLines = false;
@observable keepConfig = false;
@observable autoClearHistory = true;
@observable chaidanOption = {
changXiuBian: 6,
duanXiuBian: 6,
useDefaultRad: true,
radius: 2.5,
modeling2HoleRad: 20, //圆造型小于等于该值拆成孔数据
isCheckInterfere: false,
};
@observable autoLines = false;
constructor()
{
this.Init();
@ -111,12 +122,18 @@ export class UserConfig implements IConfigStore
height: 2440,
width: 1220
});
this.modeling2HoleRad = 20;
Object.assign(this.kjlConfig, {
grooveAddLength: "0",
grooveAddWidth: "0",
grooveAddDepth: "1"
});
Object.assign(this.chaidanOption, {
changXiuBian: 6,
duanXiuBian: 6,
useDefaultRad: true,
radius: 2.5,
modeling2HoleRad: 20,
});
}
SaveConfig()
{
@ -126,7 +143,6 @@ export class UserConfig implements IConfigStore
openDrillingReactor: this.openDrillingReactor,
openAutoCuttingReactor: this.openAutoCuttingReactor,
maxSize: toJS(this.maxSize),
modeling2HoleRad: this.modeling2HoleRad,
kjlConfig: toJS(this.kjlConfig),
systemConfig: toJS(this.SystemConfig),
viewDirType: this.viewDirType,
@ -136,6 +152,8 @@ export class UserConfig implements IConfigStore
showLines: this.showLines,
keepConfig: this.keepConfig,
autoClearHistory: this.autoClearHistory,
chaidanOption: toJS(this.chaidanOption),
autoLines: this.autoLines,
}
};
}
@ -144,8 +162,9 @@ export class UserConfig implements IConfigStore
this.openDrillingReactor = config.option.openDrillingReactor;
this.openAutoCuttingReactor = config.option.openAutoCuttingReactor;
Object.assign(this.maxSize, config.option.maxSize);
this.modeling2HoleRad = config.option.modeling2HoleRad;
Object.assign(this.kjlConfig, config.option.kjlConfig);
this.modeling2HoleRad = config.option.modeling2HoleRad;
if (config.option.version > 1)
{
Object.assign(this.SystemConfig, config.option.systemConfig);
@ -176,6 +195,13 @@ export class UserConfig implements IConfigStore
{
this.autoClearHistory = config.option.autoClearHistory;
}
if (config.option.version > 8)
{
Object.assign(this.chaidanOption, config.option.chaidanOption);
this.autoLines = config.option.autoLines;
}
else
this.chaidanOption.modeling2HoleRad = this.modeling2HoleRad;
}
}

@ -129,7 +129,7 @@ export function CalcEdgeSealing(cus: Curve[])
let frontLine = cus[i];
let laterIndex = FixIndex(i + 1, cus);
let laterLine = cus[laterIndex];
if (equalv3(frontLine.EndPoint, laterLine.StartPoint))
if (equalv3(frontLine.EndPoint, laterLine.StartPoint, 1e-2))
continue;
let refLine = oldLine ?? frontLine;
let refLine2 = i === cus.length - 1 ? firstLine : laterLine;

@ -20,6 +20,7 @@ import { FaceDirection } from "../../UI/Store/BoardInterface";
import { BoolOpeartionType, isTargetCurInOrOnSourceCur } from "../BoolOperateUtils";
import { GetSealedBoardContour } from "../CalcEdgeSealing";
import { GetCurveToInDir, GetOffsetCurves, OptimizeToolPath } from "./OptimizeToolPath";
import { userConfig } from "../../Editor/UserConfig";
/**
*
@ -172,11 +173,13 @@ export class FeedingToolPath extends Singleton
return offsetCus;
}
/**用于测试走刀路径 */
TestCalcPath(br: Board)
TestCalcPath(br: Board, isCd = false)
{
let modelings = br.BoardModeling;
let allModeling = GetModelingFromCustomDrill(br);
modelings.push(...allModeling.modeling);
if (isCd && userConfig.chaidanOption.useDefaultRad)
modelings.forEach(m => m.knifeRadius = userConfig.chaidanOption.radius);
let cus = this.CalcPath(modelings, br);
let outline = br.ContourCurve as Polyline;

@ -393,9 +393,10 @@ export namespace Production
for (let m of ms)
{
let cu = m.shape.Outline.Curve;
if (cu instanceof Circle && cu.Radius < userConfig.modeling2HoleRad + 1e-6)
if (cu instanceof Circle && cu.Radius < userConfig.chaidanOption.modeling2HoleRad + 1e-6)
continue;
if (userConfig.chaidanOption.useDefaultRad)
m.knifeRadius = userConfig.chaidanOption.radius;
let paths = tool.GetModelFeedPath(br, m);
if (!isSide)
paths.forEach(path => path.ApplyMatrix(tMtx));
@ -555,7 +556,7 @@ export namespace Production
for (let m of modelings)
{
let cu = m.shape.Outline.Curve;
if (cu instanceof Circle && cu.Radius < userConfig.modeling2HoleRad + 1e-6)
if (cu instanceof Circle && cu.Radius < userConfig.chaidanOption.modeling2HoleRad + 1e-6)
{
let center = cu.Center.setZ(0).sub(offsetTanslation);
data.frontBackHoles.push(

@ -49,9 +49,9 @@ export class DoorModal extends React.Component<{ store: DoorDrawerStore, type: B
<div className="flex">
<div className={Classes.CARD}>
<DoorConfigModal store={this.props.store} />
<div>
{/* <div>
<AutoCutCheckbox autoCutOption={this.props.store.autoCutOption} />
</div>
</div> */}
</div>
<div className={Classes.CARD} style={{ minWidth: 350 }}>
<DoorPreviewComponent store={this.props.store} />

@ -24,11 +24,11 @@ class Confirm
ReactDOM.unmountComponentAtNode(this._container);
this._container.remove();
}
async show(option: { message: string | string[]; }): Promise<boolean>
async show(option: { message: string | string[]; hasCancel?: boolean; }): Promise<boolean>
{
return new Promise((res: (boolean) => void) =>
{
ReactDOM.render(<CommonConfirm message={option.message} res={res} close={() => this.close()} />, this._container);
ReactDOM.render(<CommonConfirm hasCancel={option.hasCancel ?? true} message={option.message} res={res} close={() => this.close()} />, this._container);
});
}
show2(option: { message: string | string[]; onConfirm: () => void; })
@ -43,6 +43,7 @@ interface ICommonConfirmProps
message: string | string[];
res: Function;
close: Function;
hasCancel: boolean;
}
@observer
@ -71,7 +72,7 @@ export class CommonConfirm extends React.Component<ICommonConfirmProps>
icon="warning-sign"
isOpen={true}
confirmButtonText="确认"
cancelButtonText="取消"
cancelButtonText={this.props.hasCancel ? "取消" : ""}
intent={Intent.SUCCESS}
onConfirm={this.confirm}
onCancel={this.cancel}

@ -0,0 +1,78 @@
import * as React from 'react';
import { Card, Label, Classes, Checkbox } from "@blueprintjs/core";
import { observer } from "mobx-react";
import { userConfig } from "../../../../Editor/UserConfig";
import { ToasterInput } from '../../Toaster';
import { IUiOption } from '../../../Store/BoardInterface';
import { DataAdapter } from '../../../../Common/DataAdapter';
import { CheckObjectType } from '../../../../Common/CheckoutVaildValue';
@observer
export class ChaiDanPanel extends React.Component
{
private chaidanUiData: IUiOption<any>;
UNSAFE_componentWillMount()
{
this.chaidanUiData = DataAdapter.ConvertUIData(userConfig.chaidanOption);
}
render()
{
return (
<Card>
<p style={{ marginBottom: 10, fontSize: 12 }}>(mm)</p>
<Label className={Classes.INLINE}>
<span style={{ width: "auto" }}>:</span>
<ToasterInput
optKey="modeling2HoleRad"
inputClassName="time-config"
option={userConfig.chaidanOption}
uiOption={this.chaidanUiData}
type={CheckObjectType.GT0Num}
/>
</Label>
<div className="flex">
<Label className={Classes.INLINE} style={{ marginRight: 15 }}>
<span></span>
<ToasterInput
optKey="changXiuBian"
inputClassName="time-config"
option={userConfig.chaidanOption}
uiOption={this.chaidanUiData}
type={CheckObjectType.SmoothEdge}
/>
</Label>
<Label className={Classes.INLINE}>
<span></span>
<ToasterInput
optKey="duanXiuBian"
inputClassName="time-config"
option={userConfig.chaidanOption}
uiOption={this.chaidanUiData}
type={CheckObjectType.SmoothEdge}
/>
</Label>
</div>
<Checkbox
label="是否强制使用默认造型刀半径"
checked={userConfig.chaidanOption.useDefaultRad}
onChange={() => userConfig.chaidanOption.useDefaultRad = !userConfig.chaidanOption.useDefaultRad}
/>
<Label className={Classes.INLINE}>
<span style={{ width: "auto" }}></span>
<ToasterInput
optKey="radius"
inputClassName="time-config"
option={userConfig.chaidanOption}
uiOption={this.chaidanUiData}
type={CheckObjectType.GT0Num}
/>
</Label>
<Checkbox
label="自动检查干涉"
checked={userConfig.chaidanOption.isCheckInterfere}
onChange={() => userConfig.chaidanOption.isCheckInterfere = !userConfig.chaidanOption.isCheckInterfere}
/>
</Card>
);
}
}

@ -11,10 +11,11 @@ import { FileServer } from "../../../../DatabaseServices/FileServer";
import { userConfig } from "../../../../Editor/UserConfig";
import { DisplayConfigPanel } from "./DisplayConfigPanel";
import { DrawConfigPanel } from "./DrawConfigPanel";
import { SystemConfigPanel } from "../SystemConfig";
import { SystemConfigPanel } from "./SystemConfig";
import { StoreageKeys } from "../../../../Common/StoreageKeys";
import { userConfigStore } from "../../../Store/UserConfigStore";
import { BoardModalType } from "../../Board/BoardModal";
import { ChaiDanPanel } from "./ChaiDanModal";
export enum EOptionTabId
{
@ -22,6 +23,7 @@ export enum EOptionTabId
Show = "xs",
Sys = "sys",
Draw = "ht",
ChaiDan = "chaidan",
}
export class ConfigStore extends Singleton
@ -140,6 +142,7 @@ export class ConfigDialog extends React.Component
<Tab id={EOptionTabId.Show} title="显示" panel={<DisplayConfigPanel store={store} />} />
<Tab id={EOptionTabId.Sys} title="系统" panel={<SystemConfigPanel />} />
<Tab id={EOptionTabId.Draw} title="绘图" panel={<DrawConfigPanel store={userConfig} />} />
<Tab id={EOptionTabId.ChaiDan} title="拆单" panel={<ChaiDanPanel />} />
</Tabs>
</div>

@ -78,6 +78,7 @@ export class DrawConfigPanel extends React.Component<IConfigProps, {}> {
onChange={this.toggleAutoCuttingReactor}
/> */}
<H5></H5>
<Checkbox label="板件超长弹窗提示" checked={userConfig.maxSize.isShow} onChange={() => userConfig.maxSize.isShow = !userConfig.maxSize.isShow} />
{
[["板长", "height"], ["板宽", "width"]].map(([t, k]) =>
<Label className={Classes.INLINE}>
@ -118,6 +119,7 @@ export class DrawConfigPanel extends React.Component<IConfigProps, {}> {
</div>
<H5></H5>
<Checkbox label="显示纹路" checked={userConfig.showLines} onChange={() => userConfig.showLines = !userConfig.showLines} />
<Checkbox label="自动修改纹路" checked={userConfig.autoLines} onChange={() => userConfig.autoLines = !userConfig.autoLines} />
<H5></H5>
<Checkbox label="保持上次配置" checked={userConfig.keepConfig} onChange={() => userConfig.keepConfig = !userConfig.keepConfig} />
</Card>

@ -1,12 +1,11 @@
import * as React from 'react';
import { Card, Label, Classes, RadioGroup, Radio, Checkbox } from "@blueprintjs/core";
import { observer } from "mobx-react";
import { userConfig, ISystemConfig, ICursorConfig } from "../../../Editor/UserConfig";
import { safeEval } from "../../../Common/eval";
import { ToasterInput } from '../Toaster';
import { IUiOption } from '../../Store/BoardInterface';
import { DataAdapter } from '../../../Common/DataAdapter';
import { CheckObjectType } from '../../../Common/CheckoutVaildValue';
import { userConfig, ISystemConfig, ICursorConfig } from "../../../../Editor/UserConfig";
import { ToasterInput } from '../../Toaster';
import { IUiOption } from '../../../Store/BoardInterface';
import { DataAdapter } from '../../../../Common/DataAdapter';
import { CheckObjectType } from '../../../../Common/CheckoutVaildValue';
@observer
export class SystemConfigPanel extends React.Component
@ -24,20 +23,6 @@ export class SystemConfigPanel extends React.Component
{
return (
<Card>
<Label className={Classes.INLINE}>
<span style={{ width: "auto" }}>:</span>
<input
type="text"
className={Classes.INPUT}
defaultValue={userConfig.modeling2HoleRad}
onBlur={e =>
{
let val = safeEval(e.target.value);
if (!isNaN(val))
userConfig.modeling2HoleRad = val;
}}
/>
</Label>
<Label className={Classes.INLINE}>
<span style={{ width: "auto" }}>:</span>
<ToasterInput

@ -131,7 +131,7 @@ export class ToasterInput extends React.Component<IToasterInputProps, {}>
this.showData = props.uiOption ? props.uiOption : props.option;
if (!props.option.hasOwnProperty(props.optKey))
AppToaster.show({
message: "传入key不存在",
message: `传入key:${this.props.optKey}不存在`,
timeout: 0,
intent: Intent.DANGER,
});

Loading…
Cancel
Save