!2976 功能:图框编辑增加只显示图层和隐藏图层,作用于一键布局的图框

pull/2772/MERGE
林三 3 weeks ago committed by ChenX
parent 6a2ade7edf
commit f60a266acd

@ -101,6 +101,7 @@
"dependencies": {
"@blueprintjs/core": "^3.54.0",
"@blueprintjs/popover2": "^0.12.9",
"@blueprintjs/select": "^3.19.1",
"@blueprintjs/table": "^3.10.0",
"@epicgames-ps/lib-pixelstreamingfrontend-ue5.2": "^0.5.1",
"@jscad/modeling": "^2.12.2",

@ -8,7 +8,9 @@ import { Board } from "../DatabaseServices/Entity/Board";
import { Curve } from "../DatabaseServices/Entity/Curve";
import { Entity } from "../DatabaseServices/Entity/Entity";
import { HardwareCompositeEntity } from "../DatabaseServices/Hardware/HardwareCompositeEntity";
import { LayerTableRecord } from "../DatabaseServices/LayerTableRecord";
import { ObjectId } from "../DatabaseServices/ObjectId";
import { LayerNode } from "../DatabaseServices/Tables/LayerTable";
import { ViewportEntity } from "../DatabaseServices/ViewportEntity";
import { Command } from "../Editor/CommandMachine";
import { PromptStatus } from "../Editor/PromptResult";
@ -538,6 +540,8 @@ export interface ICustomViewportInfo
height: number;
position: Vector3;
hideTypes: string[];
hideLayer: Set<string>;
showLayer: Set<string>;
}
export function DrawCustomViewports(infos: ICustomViewportInfo[], ens: Entity[], hideEntitys: Entity[], isRevertRotate: boolean)
@ -591,11 +595,56 @@ export function DrawCustomViewports(infos: ICustomViewportInfo[], ens: Entity[],
vp.AppendHideObjects(modelIds);
}
}
//只显示图层优先级较大
if (info.showLayer?.size)
OnlyShowLayer(app.Database.LayerTable.Root.children, info.showLayer, vp);
else if (info.hideLayer?.size)
OnlyHideLayer(app.Database.LayerTable.Root.children, info.hideLayer, vp);
vps.push(vp);
}
return vps;
}
//只显示的图层
function OnlyShowLayer(layerNodes: LayerNode[], showLayerList: Set<string>, vp: ViewportEntity)
{
for (let node of layerNodes)
{
if (!node.children?.length)
{
if (!showLayerList.has(node.name))
{
let layer = app.Database.LayerTable.Symbols.get(node.name) as LayerTableRecord;
if (layer?.Id)
vp.AddFreezeLayer(layer.Id);
}
}
else
OnlyShowLayer(node.children, showLayerList, vp);
}
}
//只隐藏的图层
function OnlyHideLayer(layerNodes: LayerNode[], hideLayerList: Set<string>, vp: ViewportEntity, hideChildren = false)
{
for (let node of layerNodes)
{
if (hideChildren || hideLayerList.has(node.name))
{
if (node.children?.length)
OnlyHideLayer(node.children, hideLayerList, vp, hideChildren);
else
{
let layer = app.Database.LayerTable.Symbols.get(node.name) as LayerTableRecord;
if (layer?.Id)
vp.AddFreezeLayer(layer.Id);
}
}
}
}
/**
*
*/

@ -1,4 +1,3 @@
import { observable } from "mobx";
import { Matrix4, Vector3 } from "three";
import { app } from "../../ApplicationServices/Application";
import { LogType } from "../../Common/Log";
@ -10,14 +9,8 @@ import { BoardModalType } from "../../UI/Components/Board/BoardModalType";
import { ModalState } from "../../UI/Components/Modal/ModalInterface";
import { userConfigStore } from "../../UI/Store/UserConfigStore";
import { EditFrameModal } from "./EditFrameModal";
import { EditViewSettingStore } from "./EditViewport";
export class EditFrameStore
{
@observable HideOptions: [string, boolean][] = [["隐藏门板", false], ["隐藏抽屉", false], ["隐藏标注", false], ["隐藏曲线", false], ["隐藏模型", false]];
@observable BoardInfoOptions: [string, boolean][] = [["房间名", false], ["柜名", false], ["板材名", false], ["材料", false], ["颜色", false], ["页码", false], ["日期/时间", false], ["设计师", false], ["图纸名称", false]];
@observable ViewAndVisionOption: [string, boolean][] = [["左视图", false], ["概念", false]];
}
import { EditViewOptionKey } from "./EditViewOption";
import { EditViewSettingStore } from "./EditViewSettingStore";
export class EditFrame implements Command
{
@ -33,56 +26,87 @@ export class EditFrame implements Command
await userConfigStore.UpdateBoardOption(this.store.configName, BoardModalType.EditViewSetting, this.store);
}
let store = new EditFrameStore();
app.Editor.ModalManage.RenderModal(EditFrameModal, { store });
app.Editor.ModalManage.RenderModal(EditFrameModal, { store: this.store });
let state = await app.Editor.ModalManage.Wait();
if (state.Status !== ModalState.Ok)
return;
this._TextColor = app.Viewer.isLayout ? 0 : 7;
let mtx = new Matrix4();
let nens = [];
let lables: Text[] = [];
this._Texts = [];
const m_Option = this.store.m_Option;
for (let [key, lable] of this.store.ViewAndVisionOption)
{
if (m_Option[key])
{
let t = new Text;
if (key === EditViewOptionKey.viewDir)
t.TextString = "@" + m_Option[EditViewOptionKey.viewDirValue];
else if (key === EditViewOptionKey.renderType)
t.TextString = "@@" + m_Option[EditViewOptionKey.renderTypeValue];
t.ColorIndex = this._TextColor;
t.Height = m_Option.hight;
this._Texts.push(t);
lables.push(JigUtils.Draw(t));
}
}
for (let i = 0; i < store.ViewAndVisionOption.length; i++)
for (let [key, lable] of this.store.HideOptions)
{
if (store.ViewAndVisionOption[i][1])
if (m_Option[key])
{
let t = new Text;
if (i == 0)
t.TextString = "@" + store.ViewAndVisionOption[i][0];
else if (i == 1)
t.TextString = "@@" + store.ViewAndVisionOption[i][0];
t.TextString = "@@@" + lable;
t.ColorIndex = this._TextColor;
t.Height = this.store.config.option.hight;
t.Height = m_Option.hight;
this._Texts.push(t);
nens.push(JigUtils.Draw(t));
lables.push(JigUtils.Draw(t));
}
}
for (let i = 0; i < store.HideOptions.length; i++)
for (let [key, lable] of this.store.BoardInfoOptions)
{
if (store.HideOptions[i][1])
if (m_Option[key])
{
let t = new Text;
t.TextString = "@@@" + store.HideOptions[i][0];
t.TextString = "$" + lable;
t.ColorIndex = this._TextColor;
t.Height = this.store.config.option.hight;
t.Height = m_Option.hight;
this._Texts.push(t);
nens.push(JigUtils.Draw(t));
lables.push(JigUtils.Draw(t));
}
}
for (let i = 0; i < store.BoardInfoOptions.length; i++)
if (m_Option[EditViewOptionKey.showLayer])
{
if (store.BoardInfoOptions[i][1])
let showLayerList = m_Option[EditViewOptionKey.showLayerValue].split(" ").filter((str) => str && str !== " ");
for (let layerName of showLayerList)
{
let t = new Text;
t.TextString = "$" + store.BoardInfoOptions[i][0];
t.TextString = "#" + layerName;
t.ColorIndex = this._TextColor;
t.Height = this.store.config.option.hight;
t.Height = m_Option.hight;
this._Texts.push(t);
nens.push(JigUtils.Draw(t));
lables.push(JigUtils.Draw(t));
}
}
if (nens.length === 0) return;
else if (m_Option[EditViewOptionKey.hideLayer])
{
let hideLayerList = m_Option[EditViewOptionKey.hideLayerValue].split(" ").filter((str) => str && str !== " ");
for (let layerName of hideLayerList)
{
let t = new Text;
t.TextString = "##" + layerName;
t.ColorIndex = this._TextColor;
t.Height = m_Option.hight;
this._Texts.push(t);
lables.push(JigUtils.Draw(t));
}
}
if (lables.length === 0) return;
while (true)
{
@ -92,11 +116,11 @@ export class EditFrame implements Command
Callback: (p: Vector3) =>
{
mtx.setPosition(p);
for (let i = 0; i < nens.length; i++)
for (let i = 0; i < lables.length; i++)
{
let pox = p.clone();
pox.y += (nens.length - 1 - i) * this.store.config.option.hight * 1.35;
nens[i].ApplyMatrix(mtx);
pox.y += (lables.length - 1 - i) * m_Option.hight * 1.35;
lables[i].ApplyMatrix(mtx);
this._Texts[i].Position = pox;
}
}
@ -105,7 +129,7 @@ export class EditFrame implements Command
{
if (ptRes.StringResult === "H")
{
let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: this.store.config.option.hight });
let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: m_Option.hight });
if (ret.Status === PromptStatus.OK)
{
if (ret.Distance <= 0 || isNaN(ret.Distance))
@ -116,7 +140,7 @@ export class EditFrame implements Command
{
for (let t of this._Texts)
t.Height = Math.abs(ret.Distance);
this.store.config.option.hight = Math.abs(ret.Distance);
m_Option.hight = Math.abs(ret.Distance);
userConfigStore.SaveConfig(BoardModalType.EditViewSetting, this.store, { toaster: false });
}
}

@ -1,11 +1,18 @@
import { Button, Checkbox, Classes, HTMLSelect, Icon } from "@blueprintjs/core";
import { Button, Checkbox, Classes, HTMLSelect, Icon, Tooltip } from "@blueprintjs/core";
import { observable } from "mobx";
import { observer } from "mobx-react";
import React from "react";
import * as xaop from 'xaop';
import { app } from "../../ApplicationServices/Application";
import { KeyBoard } from "../../Common/KeyEnum";
import { LayerNode } from "../../DatabaseServices/Tables/LayerTable";
import { BoardModalType } from "../../UI/Components/Board/BoardModalType";
import { Config_ModalType, UserConfigComponent } from "../../UI/Components/Board/UserConfigComponent";
import { ModalState } from "../../UI/Components/Modal/ModalInterface";
import { EditFrameStore } from "./EditFrame";
import "./EditFrameModalStyle.less";
import { EditViewOptionKey } from "./EditViewOption";
import { EditViewSettingStore } from "./EditViewSettingStore";
import { LayerInfo, LayerSelect } from "./LayerSelectModal";
const ViewAndVisionOptions = [[
{ label: "左视图", value: "左视图" },
@ -26,12 +33,15 @@ const ViewAndVisionOptions = [[
]];
@observer
export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
export class EditFrameModal extends React.Component<{ store: EditViewSettingStore; }>
{
_Event: Function;
LayerInfoItem: LayerInfo[] = [];
@observable ShowLayerInput: React.RefObject<HTMLInputElement> = React.createRef();
@observable HideLayerInput: React.RefObject<HTMLInputElement> = React.createRef();
registerEvent()
{
this._Event = xaop.begin(app.Editor.ModalManage, app.Editor.ModalManage.OnKeyDown, (e: KeyboardEvent) =>
{
if (e.keyCode === KeyBoard.Enter ||
@ -44,10 +54,13 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
e.stopPropagation();
});
}
UNSAFE_componentWillMount()
{
//注册事件
this.registerEvent();
this.LayerInfoItem = [];
this.GetLayerAllItem(app.Database.LayerTable.Root.children);
}
componentWillUnmount()
{
@ -55,9 +68,67 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
this._Event = null;
}
GetLayerAllItem(nodeList: LayerNode[], stratNum = 1, parentName = "")
{
for (let node of nodeList)
{
this.LayerInfoItem.push({ title: node.name, stratNum, parentName });
if (node.children?.length)
{
let childrenStratNum = stratNum + 1;
this.GetLayerAllItem(node.children, childrenStratNum, node.name);
}
}
}
LayerInput = (key: EditViewOptionKey, inputRef: React.LegacyRef<HTMLInputElement>) =>
{
return <Tooltip content="多个图层名称可以用空格间隔开">
<input
className="bp3-input br-process-input"
key={key}
tabIndex={1}
type={"text"}
ref={inputRef}
value={this.props.store.m_Option[key] as string}
style={{ height: 28, width: 210 }}
onKeyDown={(e) =>
{
switch (e.keyCode)
{
case KeyBoard.Escape:
case KeyBoard.Enter:
e.currentTarget.blur();
e.stopPropagation();
break;
case KeyBoard.Space:
e.stopPropagation();
break;
default:
break;
}
}}
onChange={(e) =>
{
let value = e.target.value;
value = value.trimStart();
if (value.endsWith(" "))
value = value.substring(0, value.length - 1);
(this.props.store.m_Option[key] as string) = value;
}}
onBlur={(e) =>
{
(this.props.store.m_Option[key] as string) = e.currentTarget.value;
}}
/>
</Tooltip>;
};
render()
{
const { BoardInfoOptions, HideOptions, ViewAndVisionOption } = this.props.store;
const { BoardInfoOptions, HideOptions, ViewAndVisionOption, LayerOption, m_Option } = this.props.store;
return (
<div id="EditFrameModal" className={Classes.DIALOG_CONTAINER}>
<div className={Classes.DIALOG}>
@ -74,24 +145,24 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
<div className={Classes.DIALOG_BODY}>
<div className="frame-view">
{
ViewAndVisionOption.map((opt, i) =>
Array.from(ViewAndVisionOption).map(([key, label], i) =>
{
return (
<div key={opt[0]}>
<div key={key}>
<Checkbox
checked={opt[1]}
checked={m_Option[key]}
onClick={(event) =>
{
opt[1] = !opt[1];
m_Option[key] = !m_Option[key];
event.currentTarget.blur();
app.Editor.ModalManage.ChangeFoucus();
}}
>
<HTMLSelect
style={{ height: "28px" }}
value={opt[0]}
value={m_Option[key + "Value"]}
options={ViewAndVisionOptions[i]}
onChange={(e) => { opt[0] = e.target.value; }}
onChange={(e) => { m_Option[key + "Value"] = e.target.value; }}
/>
</Checkbox>
</div>
@ -100,29 +171,97 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
}
</div>
<div className="frame-options">
<div>
{
new Array(BoardInfoOptions, HideOptions).map((opts, i) =>
Array.from(BoardInfoOptions).map(([key, lable]) =>
{
return (
<div key={i.toString()}>
<Checkbox
key={key}
label={lable}
checked={m_Option[key]}
onClick={(event) =>
{
opts.map(opt =>
m_Option[key] = !m_Option[key];
event.currentTarget.blur();
app.Editor.ModalManage.ChangeFoucus();
}}
/>);
})
}
</div>
<div className="hideOptions">
<div className="hide1" style={{ display: "flex" }}>
{
Array.from(HideOptions).map(([key, lable]) =>
{
return (
<Checkbox
key={opt[0]}
label={opt[0]}
checked={opt[1]}
key={key}
label={lable}
checked={m_Option[key]}
onClick={(event) =>
{
opt[1] = !opt[1];
m_Option[key] = !m_Option[key];
event.currentTarget.blur();
app.Editor.ModalManage.ChangeFoucus();
}}
/>);
})}
</div>);
})}
})
}
</div>
<div className="layer">
<div className="showLayer">
<div className="showLayerSelect">
<Checkbox
key={EditViewOptionKey.showLayer}
label={LayerOption.get(EditViewOptionKey.showLayer)}
checked={m_Option[EditViewOptionKey.showLayer]}
onClick={(event) =>
{
m_Option[EditViewOptionKey.showLayer] = !m_Option[EditViewOptionKey.showLayer];
event.currentTarget.blur();
app.Editor.ModalManage.ChangeFoucus();
}}
/>
<LayerSelect
inputElement={this.ShowLayerInput}
items={this.LayerInfoItem}
m_Option={m_Option}
editViewOptionKey={EditViewOptionKey.showLayerValue}
/>
</div>
<div className='showLayerInput'>
{this.LayerInput(EditViewOptionKey.showLayerValue, this.ShowLayerInput)}
</div>
</div>
<div className="hideLayer">
<div className="hideLayerSelect">
<Checkbox
key={EditViewOptionKey.hideLayer}
label={LayerOption.get(EditViewOptionKey.hideLayer)}
disabled={m_Option[EditViewOptionKey.showLayer]}
checked={m_Option[EditViewOptionKey.hideLayer]}
onClick={(event) =>
{
m_Option[EditViewOptionKey.hideLayer] = !m_Option[EditViewOptionKey.hideLayer];
event.currentTarget.blur();
app.Editor.ModalManage.ChangeFoucus();
}}
/>
<LayerSelect
inputElement={this.HideLayerInput}
items={this.LayerInfoItem}
m_Option={m_Option}
editViewOptionKey={EditViewOptionKey.hideLayerValue}
/>
</div>
<div className='hideLayerInput'>
{this.LayerInput(EditViewOptionKey.hideLayerValue, this.HideLayerInput)}
</div>
</div>
</div>
</div>
</div>
<div>
<Checkbox
@ -130,17 +269,15 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
label={"全选/反选"}
onChange={(e) =>
{
for (let name of [...HideOptions, ...BoardInfoOptions, ...ViewAndVisionOption])
{
name[1] = e.currentTarget.checked;
}
for (let [key, label] of [...HideOptions, ...BoardInfoOptions, ...ViewAndVisionOption])
m_Option[key] = e.currentTarget.checked;
}}
/>
</div>
</div>
<div className={Classes.DIALOG_FOOTER}>
<div className={Classes.DIALOG_FOOTER_ACTIONS}>
<div className="foot_right">
<div className={Classes.DIALOG_FOOTER} style={{ justifyContent: "space-between" }}>
<UserConfigComponent store={this.props.store} type={BoardModalType.EditViewSetting} configType={Config_ModalType.UserConfigModal} />
<div className="foot-right">
<Button
intent="success"
text="确定"
@ -159,7 +296,6 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
</div>
</div>
</div>
</div >
);
}
}

@ -0,0 +1,83 @@
#EditFrameModal {
font-size: 14px;
.bp3-dialog-body {
width: 430px;
padding: 15px 25px 10px 27px;
}
.frame-view {
display: flex;
justify-content: space-around;
margin-bottom: 10px;
&>:nth-child(1) {
margin-right: 40px;
}
.bp3-html-select .bp3-icon {
top: 6px;
}
}
.frame-options {
display: flex;
flex-direction: row;
justify-content: flex-start;
margin-left: 12px;
&>:nth-child(1) {
margin-right: 40px;
}
.hideOptions {
width: 220px;
.hide1 {
display: flex;
flex-wrap: wrap;
align-content: stretch;
.bp3-checkbox {
margin-right: 20px;
}
}
.layer {
margin-top: 10px;
label {
width: 85px;
}
.hideLayer {
margin-top: 18px;
}
}
.showLayer .showLayerSelect {
display: flex;
}
.hideLayer .hideLayerSelect {
display: flex;
}
.bp3-button {
margin: -6px 0 0 5px;
}
}
}
.bp3-dialog-footer {
height: 45px;
display: flex;
.foot-right {
:nth-child(2) {
margin-left: 3px;
}
}
}
}

@ -0,0 +1,55 @@
import { IBaseOption } from "../../UI/Store/OptionInterface/IOptionInterface";
export enum EditViewOptionKey
{
hight = "hight", //文字高度
renderType = "renderType", //视图
renderTypeValue = "renderTypeValue", //视图值
viewDir = "viewDir", //视角
viewDirValue = "viewDirValue", //视角值
roomName = "roomName",//房间名
cabinetName = "cabinetName",//柜名
boardMaterialName = "boardMaterialName", //板材名
material = "material", //材料
color = "color",//颜色
page = "page",//页码
date = "date",//时间
designer = "designer",//设计师
sheetName = "sheetName",//图纸名称
hideDoor = "hideDoor",//隐藏门板
hideDrawer = "hideDrawer",//隐藏抽屉
hideDim = "hideDim",//隐藏标注
hideCurve = "hideCurve",//隐藏曲线
hideModel = "hideModel",//隐藏模型
hideLayer = "hideLayer",//隐藏图层
hideLayerValue = "hideLayerValue",//隐藏图层值
showLayer = "showLayer",//显示图层
showLayerValue = "showLayerValue",//显示图层值
}
export interface EditViewOption extends IBaseOption
{
[EditViewOptionKey.hight]: number;//文字大小
[EditViewOptionKey.renderType]: boolean;
[EditViewOptionKey.renderTypeValue]: string;
[EditViewOptionKey.viewDir]: boolean;
[EditViewOptionKey.viewDirValue]: string;
[EditViewOptionKey.roomName]: boolean;
[EditViewOptionKey.cabinetName]: boolean;
[EditViewOptionKey.boardMaterialName]: boolean;
[EditViewOptionKey.material]: boolean;
[EditViewOptionKey.color]: boolean;
[EditViewOptionKey.page]: boolean;
[EditViewOptionKey.date]: boolean;
[EditViewOptionKey.designer]: boolean;
[EditViewOptionKey.sheetName]: boolean; //图纸名称
[EditViewOptionKey.hideDoor]: boolean;
[EditViewOptionKey.hideDrawer]: boolean;
[EditViewOptionKey.hideDim]: boolean;
[EditViewOptionKey.hideCurve]: boolean;
[EditViewOptionKey.hideModel]: boolean;
[EditViewOptionKey.hideLayer]: boolean;
[EditViewOptionKey.hideLayerValue]: string;
[EditViewOptionKey.showLayer]: boolean;
[EditViewOptionKey.showLayerValue]: string;
}

@ -0,0 +1,69 @@
import { observable, toJS } from "mobx";
import { DefaultEditViewOption } from "../../Editor/DefaultConfig";
import { IConfigOption } from "../../UI/Components/Board/UserConfigComponent";
import { IConfigStore } from "../../UI/Store/BoardStore";
import { EditViewOption, EditViewOptionKey } from "./EditViewOption";
export class EditViewSettingStore implements IConfigStore
{
@observable configName = "默认";
@observable configsNames = [];
@observable m_Option: EditViewOption = { ...DefaultEditViewOption };
HideOptions: Map<string, string> = new Map([
[EditViewOptionKey.hideDoor, "隐藏门板"],
[EditViewOptionKey.hideDrawer, "隐藏抽屉"],
[EditViewOptionKey.hideDim, "隐藏标注"],
[EditViewOptionKey.hideCurve, "隐藏曲线"],
[EditViewOptionKey.hideModel, "隐藏模型"]
]);
BoardInfoOptions: Map<string, string> = new Map([
[EditViewOptionKey.roomName, "房间名"],
[EditViewOptionKey.cabinetName, "柜名"],
[EditViewOptionKey.boardMaterialName, "板材名"],
[EditViewOptionKey.material, "材料"],
[EditViewOptionKey.color, "颜色"],
[EditViewOptionKey.page, "页码"],
[EditViewOptionKey.date, "日期/时间"],
[EditViewOptionKey.designer, "设计师"],
[EditViewOptionKey.sheetName, "图纸名称"]
]);
ViewAndVisionOption: Map<string, string> = new Map([
[EditViewOptionKey.viewDir, "视图"],
[EditViewOptionKey.renderType, "视觉样式"]
]);
LayerOption: Map<string, string> = new Map([
[EditViewOptionKey.hideLayer, "隐藏图层"],
[EditViewOptionKey.showLayer, "显示图层"]
]);
InitOption()
{
Object.assign(this.m_Option, DefaultEditViewOption);
}
SaveConfig()
{
let newConfig: IConfigOption = {};
newConfig.option = toJS(this.m_Option);
return newConfig;
}
UpdateOption(conf: IConfigOption<EditViewOption>)
{
if (!conf.option.version)
{
this.InitOption();
this.m_Option.hight = conf.option.hight;
return;
}
Object.assign(this.m_Option, conf.option);
}
}
export class EditFrameStore
{
@observable HideOptions: [string, boolean][] = [["隐藏门板", false], ["隐藏抽屉", false], ["隐藏标注", false], ["隐藏曲线", false], ["隐藏模型", false]];
@observable BoardInfoOptions: [string, boolean][] = [["房间名", false], ["柜名", false], ["板材名", false], ["材料", false], ["颜色", false], ["页码", false], ["日期/时间", false], ["设计师", false], ["图纸名称", false]];
@observable ViewAndVisionOption: [string, boolean][] = [["左视图", false], ["概念", false]];
@observable LayerOption: [string, boolean][] = [["隐藏图层", false]];
}

@ -12,12 +12,11 @@ import { JigUtils } from "../../Editor/JigUtils";
import { PromptStatus } from "../../Editor/PromptResult";
import { TempEditor } from "../../Editor/TempEditor";
import { BoardModalType } from "../../UI/Components/Board/BoardModalType";
import { IConfigOption } from "../../UI/Components/Board/UserConfigComponent";
import { ModalState } from "../../UI/Components/Modal/ModalInterface";
import { AppToaster } from "../../UI/Components/Toaster";
import { IConfigStore } from "../../UI/Store/BoardStore";
import { DownPanelStore } from "../../UI/Store/DownPanelStore";
import { userConfigStore } from "../../UI/Store/UserConfigStore";
import { EditViewSettingStore } from "./EditViewSettingStore";
import { EditViewportModal } from "./EditViewportModal";
export class EditViewportStore
@ -83,7 +82,7 @@ export class EditViewport implements Command
let t = new Text;
t.TextString = this.HandleTextMetaData(store.cName[i][0], board);
t.ColorIndex = 0;
t.Height = this.store.config.option.hight;
t.Height = this.store.m_Option.hight;
this._Texts.push(t);
nens.push(JigUtils.Draw(t));
}
@ -115,7 +114,7 @@ export class EditViewport implements Command
for (let i = 0; i < this._Texts.length; i++)
{
let pox = p.clone();
pox.y += (this._Texts.length - 1 - i) * this.store.config.option.hight * 1.35;
pox.y += (this._Texts.length - 1 - i) * this.store.m_Option.hight * 1.35;
nens[i].ApplyMatrix(mtx);
this._Texts[i].Position = pox;
}
@ -126,7 +125,7 @@ export class EditViewport implements Command
{
if (ptRes.StringResult === "H")
{
let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: this.store.config.option.hight });
let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: this.store.m_Option.hight });
if (ret.Status === PromptStatus.OK)
{
if (ret.Distance <= 0 || isNaN(ret.Distance))
@ -137,7 +136,7 @@ export class EditViewport implements Command
{
for (let t of this._Texts)
t.Height = Math.abs(ret.Distance);
this.store.config.option.hight = Math.abs(ret.Distance);
this.store.m_Option.hight = Math.abs(ret.Distance);
userConfigStore.SaveConfig(BoardModalType.EditViewSetting, this.store, { toaster: false });
}
}
@ -178,31 +177,3 @@ export class EditViewport implements Command
}
}
}
//只是用来保存配置
export class EditViewSettingStore implements IConfigStore
{
configName = "默认";
configsNames = ['默认'];
config = {
option: {
hight: 60
}
};
InitOption()
{
this.config = {
option: {
hight: 60
}
};
}
SaveConfig()
{
return this.config;
}
UpdateOption(conf: IConfigOption<any>)
{
Object.assign(this.config, conf);
}
}

@ -0,0 +1,93 @@
import { Button, MenuItem } from "@blueprintjs/core";
import { ItemPredicate, ItemRenderer, Select } from "@blueprintjs/select";
import * as React from "react";
import { RefObject } from "react";
import { EditViewOption, EditViewOptionKey } from "./EditViewOption";
interface LayerSelectProp
{
inputElement: RefObject<HTMLInputElement>;
items: LayerInfo[];
m_Option: EditViewOption,
editViewOptionKey: EditViewOptionKey,
}
export interface LayerInfo
{
title: string;
stratNum: number;
parentName: string;
}
const FilterLayer: ItemPredicate<LayerInfo> = (query, film, _index, exactMatch) =>
{
const normalizedTitle = film.title.toLowerCase();
const normalizedQuery = query.toLowerCase();
if (exactMatch)
return normalizedTitle === normalizedQuery;
else
return `${normalizedTitle}`.indexOf(normalizedQuery) >= 0;
};
const RenderLayer: ItemRenderer<LayerInfo> = (layer, { handleClick, modifiers, query }) =>
{
if (!modifiers.matchesPredicate)
{
return null;
}
return (
<MenuItem
active={false} //控制亮显 (当前选择)
disabled={modifiers.disabled}
key={layer.title}
onClick={handleClick}
text={`${' '.repeat(layer.stratNum - 1)}${layer.title}`}
label={layer.parentName}
/>
);
};
const CheckParent = (alreadyExistsLayer: string[], item: LayerInfo, allItems: LayerInfo[]) =>
{
let parentItem = allItems.find(i => i.title === item.parentName);
if (parentItem)
return alreadyExistsLayer.includes(parentItem.title) || CheckParent(alreadyExistsLayer, parentItem, allItems);
else
return false;
};
const DisabledLayer = (item: LayerInfo, allItems: LayerInfo[], text: string) =>
{
let alreadyExistsLayer = text?.split(" ") || [];
;
return alreadyExistsLayer.includes(item.title) || CheckParent(alreadyExistsLayer, item, allItems);
};
const OnItemSelect = (item: LayerInfo, inputElement: React.RefObject<HTMLInputElement>, option: EditViewOption, key: EditViewOptionKey) =>
{
let valueList = inputElement.current.value.split(" ").filter((str) => str && str !== " ");
let newStr = valueList.join(" ");
if (newStr)
inputElement.current.value = newStr + ` ${item.title}`;
else
inputElement.current.value = item.title;
(option[key] as string) = inputElement.current.value;
};
export const LayerSelect: React.FC<LayerSelectProp> = (props: LayerSelectProp) =>
{
return (
<Select<LayerInfo>
items={props.items}
itemPredicate={FilterLayer}
itemRenderer={RenderLayer}
itemDisabled={(item) => DisabledLayer(item, props.items, props.inputElement?.current?.value)}
noResults={<MenuItem disabled={true} text="没有查询到图层名称.." />}
onItemSelect={(item) => OnItemSelect(item, props.inputElement, props.m_Option, props.editViewOptionKey)}
>
<Button className="selectButton" text="添加图纸的图层" />
</Select>
);
};

@ -61,7 +61,7 @@ export enum HideEntityText
Curve = "curve", //曲线
Drawer = "drawer", //抽屉
House = "house", //户型
Model = "model"//模型
Model = "model", //模型
}
export class OneKeyLayout implements Command
@ -113,16 +113,18 @@ export class OneKeyLayout implements Command
cloneC.TempData = en;
if (cloneC instanceof Text)
{
if (cloneC.TextString.startsWith("@"))
let str = cloneC.TextString;
if (str.startsWith("@") || str.startsWith("#"))
texts.push(en as Text);
if (cloneC.TextString.startsWith("$"))
if (cloneC.TextString.startsWith("$页码"))
else if (str.startsWith("$"))
if (str.startsWith("$页码"))
pagTexts.add(cloneC);
else if (cloneC.TextString.startsWith("$图纸名称"))
else if (str.startsWith("$图纸名称"))
paperTexts.add(cloneC);
else if (cloneC.TextString.startsWith("$日期/时间"))
else if (str.startsWith("$日期/时间"))
dateTexts.add(cloneC);
else if (cloneC.TextString.startsWith("$设计师"))
else if (str.startsWith("$设计师"))
userTexts.add(cloneC);
else
specialTexts.add(cloneC);
@ -600,7 +602,10 @@ export class OneKeyLayout implements Command
let vpRects: IRectInfo[] = [];
let renderTypeTexts: Text[] = [];
let dirTexts: Text[] = [];
let hideBoardTexts: Text[] = []; //文字隐藏指令
let hideEntityTexts: Text[] = []; //文字隐藏指令
let onlyShowLayerTexts: Text[] = []; //只显示的图层
let onlyHideLayerTexts: Text[] = []; //隐藏图层
const useCache = new WeakSet<Entity>();
const GetRenderType = (txt: string) =>
@ -698,7 +703,7 @@ export class OneKeyLayout implements Command
{
if (en.TextString.startsWith("@@@"))
{
hideBoardTexts.push(en);
hideEntityTexts.push(en);
}
else if (en.TextString.startsWith("@@"))
{
@ -708,6 +713,14 @@ export class OneKeyLayout implements Command
{
dirTexts.push(en);
}
else if (en.TextString.startsWith("##"))
{
onlyHideLayerTexts.push(en);
}
else if (en.TextString.startsWith("#"))
{
onlyShowLayerTexts.push(en);
}
}
}
@ -722,6 +735,8 @@ export class OneKeyLayout implements Command
position: box.min.clone().sub(basePt),
renderType: RenderType.Print,
hideTypes: [],
showLayer: new Set,
hideLayer: new Set,
};
box.max.setZ(0);
@ -749,7 +764,7 @@ export class OneKeyLayout implements Command
break;
}
}
for (let text of hideBoardTexts)
for (let text of hideEntityTexts)
{
let pos = text.Position.setZ(0);
if (!useCache.has(text) && box.containsPoint(pos))
@ -759,6 +774,29 @@ export class OneKeyLayout implements Command
this._cacheRect.add(text);
}
}
for (let text of onlyShowLayerTexts)
{
let pos = text.Position.setZ(0);
if (!useCache.has(text) && box.containsPoint(pos))
{
vpInfo.showLayer.add(text.TextString.slice(1));
useCache.add(text);
this._cacheRect.add(text);
}
}
for (let text of onlyHideLayerTexts)
{
let pos = text.Position.setZ(0);
if (!useCache.has(text) && box.containsPoint(pos))
{
vpInfo.hideLayer.add(text.TextString.slice(2));
useCache.add(text);
this._cacheRect.add(text);
}
}
vpInfos.push(vpInfo);
}
return vpInfos;

@ -6,6 +6,5 @@ export class Test implements Command
{
async exec()
{
}
}

@ -1,4 +1,5 @@
import { FaceDirection } from "../Add-on/DrawDrilling/DrillType";
import { EditViewOption } from "../Add-on/ViewortConfig/EditViewOption";
import { Curve2RecOption } from "../Add-on/twoD2threeD/Modals/Curve2RecOption";
import { IParseBoardNameOption, IRec2BrOption, IRect2Br2Option } from "../Add-on/twoD2threeD/R2bInterface";
import { EBoardKeyList } from "../Common/BoardKeyList";
@ -1230,3 +1231,31 @@ export const DefaultSpaceParseOption: SpaceParseOption = {
autoParseDepth: false,
};
Object.freeze(DefaultSpaceParseOption);
export const DefaultEditViewOption: EditViewOption = {
version: 1,
hight: 60,
renderType: false,
renderTypeValue: "概念",
viewDir: false,
viewDirValue: "左视图",
roomName: false,
cabinetName: false,
boardMaterialName: false,
material: false,
color: false,
page: false,
date: false,
designer: false,
sheetName: false,
hideDoor: false,
hideDrawer: false,
hideDim: false,
hideCurve: false,
hideModel: false,
hideLayer: false,
hideLayerValue: "",
showLayer: false,
showLayerValue: ""
};
Object.freeze(DefaultEditViewOption);

@ -991,43 +991,13 @@ img {
}
}
#EditFrameModal {
font-size: 14px;
.bp3-dialog-body {
padding: 15px 30px 10px 20px;
}
.frame-view {
display: flex;
justify-content: space-around;
margin-bottom: 10px;
&>:nth-child(1) {
margin-right: 40px;
}
.bp3-html-select .bp3-icon {
top: 6px;
}
}
.frame-options {
display: flex;
flex-direction: row;
justify-content: flex-start;
&>:nth-child(1) {
margin-right: 40px;
}
}
.bp3-dialog-footer {
height: 50px;
.bp3-portal {
.bp3-menu {
max-height: 300px;
overflow: auto;
.bp3-dialog-footer-actions {
position: absolute;
right: 3%
.bp3-text-overflow-ellipsis {
white-space: pre
}
}
}

Loading…
Cancel
Save