Add graphic primitives

This commit is contained in:
Evgeny Redikultsev
2025-08-30 13:58:12 +05:00
parent b38c19f7bb
commit 738ce5c433
20 changed files with 367 additions and 93 deletions

View File

@@ -14,9 +14,6 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
private IBeamShearSection beamShearSection; private IBeamShearSection beamShearSection;
private IInclinedSection inclinedSection; private IInclinedSection inclinedSection;
public double CenterX { get; set; } = 0;
public double CenterY { get; set; } = 0;
public double FullDepth => inclinedSection.FullDepth; public double FullDepth => inclinedSection.FullDepth;
public double WebWidth => inclinedSection.WebWidth; public double WebWidth => inclinedSection.WebWidth;
public double ReinforcementArea => inclinedSection.BeamShearSection.ReinforcementArea; public double ReinforcementArea => inclinedSection.BeamShearSection.ReinforcementArea;
@@ -35,6 +32,8 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
public PrimitiveVisualPropertyViewModel VisualProperty {get;} public PrimitiveVisualPropertyViewModel VisualProperty {get;}
public string Name => beamShearSection.Name;
public BeamShearSectionPrimitive(IBeamShearSection beamShearSection, IInclinedSection inclinedSection) public BeamShearSectionPrimitive(IBeamShearSection beamShearSection, IInclinedSection inclinedSection)
{ {
this.beamShearSection = beamShearSection; this.beamShearSection = beamShearSection;

View File

@@ -1,5 +1,8 @@
using StructureHelper.Windows.UserControls; using StructureHelper.Windows.UserControls;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Shapes;
using StructureHelperLogics.Models.BeamShears;
using System; using System;
using System.Windows.Media; using System.Windows.Media;
using PrimitiveVisualProperty = StructureHelperCommon.Models.VisualProperties.PrimitiveVisualProperty; using PrimitiveVisualProperty = StructureHelperCommon.Models.VisualProperties.PrimitiveVisualProperty;
@@ -9,24 +12,47 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
public class ConcentratedForcePrimitive : IGraphicalPrimitive public class ConcentratedForcePrimitive : IGraphicalPrimitive
{ {
private IConcentratedForce concentratedForce; private IConcentratedForce concentratedForce;
private readonly double scaleFactor; private IInclinedSection inclinedSection;
public double ScaleFactor public double ScaleFactor
{ {
get get
{ {
if (concentratedForce.ForceValue.Qy > 0) { return -1; } double forceValue = concentratedForce.ForceValue.Qy;
return 1; return forceValue / MaxForce;
} }
} }
public double TranslateX => concentratedForce.ForceCoordinate;
public double TranslateY => GetAbsoluteLevel();
public PrimitiveVisualPropertyViewModel VisualProperty { get; } = new(new PrimitiveVisualProperty(Guid.Empty)); public PrimitiveVisualPropertyViewModel VisualProperty { get; } = new(new PrimitiveVisualProperty(Guid.Empty));
public IConcentratedForce ConcentratedForce => concentratedForce; public IConcentratedForce ConcentratedForce => concentratedForce;
public ConcentratedForcePrimitive(IConcentratedForce concentratedForce) public string Name => concentratedForce.Name;
public double MaxForce { get; set; } = 1e6;
public ConcentratedForcePrimitive(IConcentratedForce concentratedForce, IInclinedSection inclinedSection)
{ {
this.concentratedForce = concentratedForce; this.concentratedForce = concentratedForce;
this.inclinedSection = inclinedSection;
VisualProperty.Color = (Color)ColorConverter.ConvertFromString("Black"); VisualProperty.Color = (Color)ColorConverter.ConvertFromString("Black");
} }
private double GetAbsoluteLevel()
{
double height;
IShape shape = inclinedSection.BeamShearSection.Shape;
if (shape is IRectangleShape rectangle) { height = rectangle.Height; }
else if (shape is ICircleShape circle) { height = circle.Diameter; }
else
{
throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(shape) + $": concentrated force {concentratedForce.Name} shape");
}
double level = (concentratedForce.RelativeLoadLevel + 0.5) * height;
return level;
}
} }
} }

View File

@@ -0,0 +1,60 @@
using StructureHelper.Windows.UserControls;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Shapes;
using StructureHelperLogics.Models.BeamShears;
using System;
using System.Windows.Media;
using PrimitiveVisualProperty = StructureHelperCommon.Models.VisualProperties.PrimitiveVisualProperty;
namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
{
public class DistributedLoadPrimitive : IGraphicalPrimitive
{
private IDistributedLoad distributedLoad;
private IInclinedSection inclinedSection;
public double ScaleFactor
{
get
{
double forceValue = distributedLoad.LoadValue.Qy;
return -1 * forceValue / MaxForce;
}
}
public double TranslateX => distributedLoad.StartCoordinate;
public double TranslateY => GetAbsoluteLevel();
public double Length => distributedLoad.EndCoordinate - distributedLoad.StartCoordinate;
public PrimitiveVisualPropertyViewModel VisualProperty { get; } = new(new PrimitiveVisualProperty(Guid.Empty));
public IDistributedLoad DistributedLoad => distributedLoad;
public string Name => distributedLoad.Name;
public double MaxForce { get; set; } = 1e6;
public DistributedLoadPrimitive(IDistributedLoad distributedLoad, IInclinedSection inclinedSection)
{
this.distributedLoad = distributedLoad;
this.inclinedSection = inclinedSection;
VisualProperty.Color = (Color)ColorConverter.ConvertFromString("LightBlue");
VisualProperty.FactoredOpacity = 90;
}
private double GetAbsoluteLevel()
{
double height;
IShape shape = inclinedSection.BeamShearSection.Shape;
if (shape is IRectangleShape rectangle) { height = rectangle.Height; }
else if (shape is ICircleShape circle) { height = circle.Diameter; }
else
{
throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(shape) + $": distributed load {distributedLoad.Name} shape");
}
double level = (distributedLoad.RelativeLoadLevel + 0.5) * height;
return level;
}
}
}

View File

@@ -1,16 +1,10 @@
using FieldVisualizer.Entities.Values.Primitives; using StructureHelper.Windows.UserControls;
using StructureHelper.Windows.UserControls;
using StructureHelperCommon.Models.VisualProperties;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
{ {
public interface IGraphicalPrimitive public interface IGraphicalPrimitive
{ {
string Name { get; }
PrimitiveVisualPropertyViewModel VisualProperty { get; } PrimitiveVisualPropertyViewModel VisualProperty { get; }
} }
} }

View File

@@ -28,6 +28,8 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
public PrimitiveVisualPropertyViewModel VisualProperty { get; } = new(new PrimitiveVisualProperty(Guid.Empty)); public PrimitiveVisualPropertyViewModel VisualProperty { get; } = new(new PrimitiveVisualProperty(Guid.Empty));
public string Name => "Inclined section";
public InclinedSectionPrimitive(IBeamShearSectionLogicResult source) public InclinedSectionPrimitive(IBeamShearSectionLogicResult source)
{ {
this.source = source; this.source = source;

View File

@@ -8,8 +8,6 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
{ {
public IStirrupByDensity StirrupByDensity { get; } public IStirrupByDensity StirrupByDensity { get; }
public double CenterX => 0;
public double CenterY => 0;
public double StartPoinX => StirrupByDensity.StartCoordinate; public double StartPoinX => StirrupByDensity.StartCoordinate;
public double BottomPointY => InclinedSection.FullDepth - InclinedSection.EffectiveDepth; public double BottomPointY => InclinedSection.FullDepth - InclinedSection.EffectiveDepth;
public double TopPointY => InclinedSection.FullDepth; public double TopPointY => InclinedSection.FullDepth;
@@ -20,6 +18,8 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
public PrimitiveVisualPropertyViewModel VisualProperty { get; } public PrimitiveVisualPropertyViewModel VisualProperty { get; }
public string Name => StirrupByDensity.Name;
public StirrupByDensityPrimitive(IStirrupByDensity stirrupByDensity, IInclinedSection inclinedSection) public StirrupByDensityPrimitive(IStirrupByDensity stirrupByDensity, IInclinedSection inclinedSection)
{ {
StirrupByDensity = stirrupByDensity; StirrupByDensity = stirrupByDensity;

View File

@@ -23,6 +23,8 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
public PrimitiveVisualPropertyViewModel VisualProperty { get; } public PrimitiveVisualPropertyViewModel VisualProperty { get; }
public string Name => StirrupByInclinedRebar.Name;
public StirrupByInclinedRebarPrimitive(IStirrupByInclinedRebar stirrupByInclinedRebar, IInclinedSection inclinedSection) public StirrupByInclinedRebarPrimitive(IStirrupByInclinedRebar stirrupByInclinedRebar, IInclinedSection inclinedSection)
{ {
StirrupByInclinedRebar = stirrupByInclinedRebar; StirrupByInclinedRebar = stirrupByInclinedRebar;

View File

@@ -11,8 +11,6 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
private readonly IStirrupByDensity stirrupByDensity; private readonly IStirrupByDensity stirrupByDensity;
public IStirrupByRebar StirrupByRebar { get; } public IStirrupByRebar StirrupByRebar { get; }
public double CenterX => 0;
public double CenterY => 0;
public double StartPoinX => StirrupByRebar.StartCoordinate; public double StartPoinX => StirrupByRebar.StartCoordinate;
public double BottomPointY => InclinedSection.FullDepth - InclinedSection.EffectiveDepth; public double BottomPointY => InclinedSection.FullDepth - InclinedSection.EffectiveDepth;
public double TopPointY => InclinedSection.FullDepth; public double TopPointY => InclinedSection.FullDepth;
@@ -20,11 +18,12 @@ namespace StructureHelper.Infrastructure.UI.GraphicalPrimitives
public double Depth => InclinedSection.EffectiveDepth; public double Depth => InclinedSection.EffectiveDepth;
public double Density => Math.Round(stirrupByDensity.StirrupDensity); public double Density => Math.Round(stirrupByDensity.StirrupDensity);
public IInclinedSection InclinedSection => inclinedSection; public IInclinedSection InclinedSection => inclinedSection;
public PrimitiveVisualPropertyViewModel VisualProperty { get; } public PrimitiveVisualPropertyViewModel VisualProperty { get; }
public string Name => StirrupByRebar.Name;
public StirrupByRebarPrimitive(IStirrupByRebar stirrupByRebar, IInclinedSection inclinedSection) public StirrupByRebarPrimitive(IStirrupByRebar stirrupByRebar, IInclinedSection inclinedSection)
{ {
this.StirrupByRebar = stirrupByRebar; this.StirrupByRebar = stirrupByRebar;

View File

@@ -343,8 +343,12 @@
<Canvas.RenderTransform> <Canvas.RenderTransform>
<TransformGroup> <TransformGroup>
<ScaleTransform <ScaleTransform
ScaleX="1" ScaleX="{Binding ScaleFactor}"
ScaleY="{Binding ScaleFactor}"/> ScaleY="{Binding ScaleFactor}"/>
<TranslateTransform
X="{Binding TranslateX}"
Y="{Binding TranslateY}"
/>
</TransformGroup> </TransformGroup>
</Canvas.RenderTransform> </Canvas.RenderTransform>
<Line <Line
@@ -368,7 +372,7 @@
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Margin="0,0,0,2" Text="Internal force: "/> <TextBlock Margin="0,0,0,2" Text="Force: "/>
<TextBlock Grid.Column="1" Text="{Binding ConcentratedForce.Name}"/> <TextBlock Grid.Column="1" Text="{Binding ConcentratedForce.Name}"/>
<TextBlock Grid.Row="1" Text="Force value: "/> <TextBlock Grid.Row="1" Text="Force value: "/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding ConcentratedForce.ForceValue.Qy, Converter={StaticResource ForceConverter}}"/> <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding ConcentratedForce.ForceValue.Qy, Converter={StaticResource ForceConverter}}"/>
@@ -377,6 +381,7 @@
</Line> </Line>
<Path <Path
Data="M 0 0 L 0.1 -0.1 L 0 -0.07 L -0.1 -0.1 Z" Data="M 0 0 L 0.1 -0.1 L 0 -0.07 L -0.1 -0.1 Z"
Visibility="{Binding VisualProperty.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
StrokeThickness="0.005" StrokeThickness="0.005"
> >
<Path.Fill> <Path.Fill>
@@ -389,5 +394,55 @@
</Canvas> </Canvas>
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="DistributedLoadPrimitiveTemplate"
DataType="primitives:DistributedLoadPrimitive">
<Canvas Visibility="{Binding VisualProperty.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" Opacity="{Binding VisualProperty.Opacity}">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform
ScaleX="1"
ScaleY="{Binding ScaleFactor}"/>
<TranslateTransform
X="{Binding TranslateX}"
Y="{Binding TranslateY}"
/>
</TransformGroup>
</Canvas.RenderTransform>
<Rectangle Height="0.2" Width="{Binding Length}" StrokeThickness="0.01">
<Rectangle.Stroke>
<SolidColorBrush Color="{Binding VisualProperty.Color}"/>
</Rectangle.Stroke>
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="{Binding VisualProperty.Color}" Offset="1"/>
<GradientStop Color="White" Offset="0"/>
</LinearGradientBrush>
</Rectangle.Fill>
<Rectangle.ToolTip>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Margin="0,0,0,2" Text="Distributed load: "/>
<TextBlock Grid.Column="1" Text="{Binding Name}"/>
<TextBlock Grid.Row="1" Text="Force value: "/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding DistributedLoad.LoadValue.Qy, Converter={StaticResource DistributedLoadConverter}}"/>
<TextBlock Grid.Row="2" Text="Start point: "/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding DistributedLoad.StartCoordinate, Converter={StaticResource LengthConverter}}"/>
<TextBlock Grid.Row="3" Text="End point: "/>
<TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding DistributedLoad.EndCoordinate, Converter={StaticResource LengthConverter}}"/>
</Grid>
</Rectangle.ToolTip>
</Rectangle>
</Canvas>
</DataTemplate>
</ResourceDictionary> </ResourceDictionary>

View File

@@ -0,0 +1,88 @@
using StructureHelper.Infrastructure.UI.GraphicalPrimitives;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.Models.BeamShears;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelper.Windows.BeamShears
{
internal class ActionToGraphicPrimitiveConvertLogic : IObjectConvertStrategy<List<IGraphicalPrimitive>, IBeamShearAction>
{
private IInclinedSection inclinedSection;
private List<IGraphicalPrimitive> graphicalPrimitives;
private double maxConcentratedForceValue = 1e6;
private double maxDistributedLoadValue = 1e6;
public ActionToGraphicPrimitiveConvertLogic(IInclinedSection inclinedSection)
{
this.inclinedSection = inclinedSection;
}
public List<IGraphicalPrimitive> Convert(IBeamShearAction source)
{
SetMaxForce(source);
SetMaxDistributedForce(source);
graphicalPrimitives = new();
var supportInternalAction = source.SupportAction.SupportForce.ForceTuple;
graphicalPrimitives.Add(GetConcentratedForcePrimitive(supportInternalAction, "Support reaction"));
foreach (var item in source.SupportAction.ShearLoads)
{
if (item is IDistributedLoad distributedLoad)
{
graphicalPrimitives.Add(GetDistributedLoadPrimitive(distributedLoad));
}
else if (item is IConcentratedForce concentratedForce)
{
graphicalPrimitives.Add(GetConcentratedForcePrimitive(concentratedForce));
}
}
return graphicalPrimitives;
}
private void SetMaxDistributedForce(IBeamShearAction source)
{
var forceList = source.SupportAction.ShearLoads
.Where(x => x is IDistributedLoad)
.Select(x => Math.Abs((x as IDistributedLoad).LoadValue.Qy))
.ToList();
maxDistributedLoadValue = forceList.Max();
}
private IGraphicalPrimitive GetDistributedLoadPrimitive(IDistributedLoad distributedLoad)
{
DistributedLoadPrimitive distributedLoadPrimitive = new(distributedLoad, inclinedSection) { MaxForce = maxDistributedLoadValue };
return distributedLoadPrimitive;
}
private ConcentratedForcePrimitive GetConcentratedForcePrimitive(IForceTuple supportInternalAction, string name)
{
ConcentratedForce force = new(Guid.Empty) { Name = name };
force.ForceValue.Qy = supportInternalAction.Qy;
force.RelativeLoadLevel = -0.5;
force.ForceCoordinate = 0;
ConcentratedForcePrimitive concentratedForcePrimitive = new(force, inclinedSection) { MaxForce = maxConcentratedForceValue};
return concentratedForcePrimitive;
}
private ConcentratedForcePrimitive GetConcentratedForcePrimitive(IConcentratedForce concentratedForce)
{
ConcentratedForcePrimitive concentratedForcePrimitive = new(concentratedForce, inclinedSection) { MaxForce = maxConcentratedForceValue };
return concentratedForcePrimitive;
}
private void SetMaxForce(IBeamShearAction source)
{
var forceList = source.SupportAction.ShearLoads
.Where(x => x is IConcentratedForce)
.Select(x => Math.Abs((x as IConcentratedForce).ForceValue.Qy))
.ToList();
forceList.Add(Math.Abs(source.ExternalForce.ForceTuple.Nz));
forceList.Add(Math.Abs(source.SupportAction.SupportForce.ForceTuple.Qy));
maxConcentratedForceValue = forceList.Max();
}
}
}

View File

@@ -7,8 +7,26 @@
xmlns:ucwp="clr-namespace:StructureHelper.Windows.UserControls.WorkPlanes" xmlns:ucwp="clr-namespace:StructureHelper.Windows.UserControls.WorkPlanes"
mc:Ignorable="d" mc:Ignorable="d"
d:DataContext="{d:DesignInstance local:InclinedSectionViewerViewModel}" d:DataContext="{d:DesignInstance local:InclinedSectionViewerViewModel}"
Title="Inclined Section Viewer" Height="650" Width="1000" WindowStartupLocation="CenterScreen"> Title="Inclined Section Viewer" Height="650" Width="1000" MinHeight="600" MinWidth="500" WindowStartupLocation="CenterScreen">
<Grid DataContext="{Binding WorkPlaneRoot}"> <Grid DataContext="{Binding WorkPlaneRoot}">
<ucwp:WorkPlaneRoot/> <Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" MinWidth="200"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox ItemsSource="{Binding PrimitiveCollection.Primitives}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<CheckBox IsChecked="{Binding VisualProperty.IsVisible}"/>
<TextBlock Grid.Column="1" Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ucwp:WorkPlaneRoot x:Name="WorkPlaneRootPanel" Grid.Column="1"/>
</Grid> </Grid>
</Window> </Window>

View File

@@ -23,9 +23,9 @@ namespace StructureHelper.Windows.BeamShears
private InclinedSectionViewerViewModel viewModel; private InclinedSectionViewerViewModel viewModel;
public InclinedSectionViewerView(InclinedSectionViewerViewModel viewModel) public InclinedSectionViewerView(InclinedSectionViewerViewModel viewModel)
{ {
InitializeComponent();
this.viewModel = viewModel; this.viewModel = viewModel;
this.DataContext = this.viewModel; this.DataContext = this.viewModel;
InitializeComponent();
} }
public InclinedSectionViewerView(IBeamShearSectionLogicResult sectionResult) : this(new InclinedSectionViewerViewModel(sectionResult)) public InclinedSectionViewerView(IBeamShearSectionLogicResult sectionResult) : this(new InclinedSectionViewerViewModel(sectionResult))
{ {

View File

@@ -1,5 +1,4 @@
using StructureHelper.Infrastructure.UI.GraphicalPrimitives; using StructureHelper.Infrastructure.UI.GraphicalPrimitives;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models.Forces; using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.Models.BeamShears; using StructureHelperLogics.Models.BeamShears;
@@ -10,6 +9,7 @@ namespace StructureHelper.Windows.BeamShears
{ {
public class SectionResultToGraphicalPrimitivesConvertLogic : IObjectConvertStrategy<List<IGraphicalPrimitive>, IBeamShearSectionLogicResult> public class SectionResultToGraphicalPrimitivesConvertLogic : IObjectConvertStrategy<List<IGraphicalPrimitive>, IBeamShearSectionLogicResult>
{ {
private IObjectConvertStrategy<List<IGraphicalPrimitive>, IBeamShearAction> actionLogic;
private IObjectConvertStrategy<List<IGraphicalPrimitive>, IStirrup> stirrupLogic; private IObjectConvertStrategy<List<IGraphicalPrimitive>, IStirrup> stirrupLogic;
private IInclinedSection inclinedSection; private IInclinedSection inclinedSection;
@@ -17,23 +17,22 @@ namespace StructureHelper.Windows.BeamShears
{ {
inclinedSection = source.InputData.InclinedSection; inclinedSection = source.InputData.InclinedSection;
InitializeStrategies(); InitializeStrategies();
List<IGraphicalPrimitive> graphicalPrimitives = new List<IGraphicalPrimitive>(); List<IGraphicalPrimitive> graphicalPrimitives = new();
BeamShearSectionPrimitive beamShearSectionPrimitive = new(source.ResultInputData.InclinedSection.BeamShearSection, inclinedSection); BeamShearSectionPrimitive beamShearSectionPrimitive = new(source.ResultInputData.InclinedSection.BeamShearSection, inclinedSection);
graphicalPrimitives.Add(beamShearSectionPrimitive); graphicalPrimitives.Add(beamShearSectionPrimitive);
var supportInternalAction = source.ResultInputData.BeamShearAction.SupportAction.SupportForce.ForceTuple; graphicalPrimitives.AddRange(actionLogic.Convert(source.ResultInputData.BeamShearAction));
ConcentratedForce SupportForce = new(Guid.Empty);
SupportForce.ForceValue.Qy = supportInternalAction.Qy;
ConcentratedForcePrimitive concentratedForcePrimitive = new(SupportForce);
graphicalPrimitives.Add((concentratedForcePrimitive));
graphicalPrimitives.AddRange(stirrupLogic.Convert(source.ResultInputData.Stirrup)); graphicalPrimitives.AddRange(stirrupLogic.Convert(source.ResultInputData.Stirrup));
InclinedSectionPrimitive inclinedSectionPrimitive = new(source); InclinedSectionPrimitive inclinedSectionPrimitive = new(source);
graphicalPrimitives.Add((inclinedSectionPrimitive)); graphicalPrimitives.Add(inclinedSectionPrimitive);
return graphicalPrimitives; return graphicalPrimitives;
} }
private void InitializeStrategies() private void InitializeStrategies()
{ {
stirrupLogic ??= new StirrupToGraphicPrimitiveConvertLogic(inclinedSection); stirrupLogic ??= new StirrupToGraphicPrimitiveConvertLogic(inclinedSection);
actionLogic ??= new ActionToGraphicPrimitiveConvertLogic(inclinedSection);
} }
} }
} }

View File

@@ -0,0 +1,24 @@
using StructureHelper.Infrastructure;
using System.Windows;
using System.Windows.Input;
namespace StructureHelper.Windows.Graphs
{
public class SaveCopyFWElementViewModel : ViewModelBase
{
private IFrameWorkElementServiseLogic frameWorkElementServiseLogic = new FrameWorkElementServiseLogic();
private RelayCommand saveImageCommand;
private RelayCommand copyToClipboardCommand;
public ICommand SaveAsImageCommand
{
get => saveImageCommand ??= new RelayCommand(o => frameWorkElementServiseLogic.SaveImageToFile(FrameWorkElement));
}
public ICommand CopyToClipboardCommand
{
get => copyToClipboardCommand ??= new RelayCommand(o => frameWorkElementServiseLogic.CopyImageToClipboard(FrameWorkElement));
}
public FrameworkElement FrameWorkElement { get; set; }
}
}

View File

@@ -2,21 +2,9 @@
using StructureHelper.Infrastructure.UI.DataContexts; using StructureHelper.Infrastructure.UI.DataContexts;
using StructureHelper.Windows.Graphs; using StructureHelper.Windows.Graphs;
using StructureHelper.Windows.MainWindow; using StructureHelper.Windows.MainWindow;
using StructureHelper.Windows.ViewModels.Materials;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace StructureHelper.Windows.UserControls namespace StructureHelper.Windows.UserControls
{ {

View File

@@ -12,6 +12,7 @@ namespace StructureHelper.Windows.UserControls.WorkPlanes
public DataTemplate StirrupByDensityTemplate { get; set; } public DataTemplate StirrupByDensityTemplate { get; set; }
public DataTemplate StirrupByInclinedRebarTemplate { get; set; } public DataTemplate StirrupByInclinedRebarTemplate { get; set; }
public DataTemplate ConcentratedForceTemplate { get; set; } public DataTemplate ConcentratedForceTemplate { get; set; }
public DataTemplate DistributedLoadTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) public override DataTemplate SelectTemplate(object item, DependencyObject container)
{ {
@@ -23,6 +24,7 @@ namespace StructureHelper.Windows.UserControls.WorkPlanes
StirrupByDensityPrimitive => StirrupByDensityTemplate, StirrupByDensityPrimitive => StirrupByDensityTemplate,
StirrupByInclinedRebarPrimitive => StirrupByInclinedRebarTemplate, StirrupByInclinedRebarPrimitive => StirrupByInclinedRebarTemplate,
ConcentratedForcePrimitive => ConcentratedForceTemplate, ConcentratedForcePrimitive => ConcentratedForceTemplate,
DistributedLoadPrimitive => DistributedLoadTemplate,
_ => base.SelectTemplate(item, container) _ => base.SelectTemplate(item, container)
}; };
} }

View File

@@ -1,11 +1,5 @@
using StructureHelper.Infrastructure; using StructureHelper.Infrastructure;
using System; using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;

View File

@@ -4,13 +4,33 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:StructureHelper.Windows.UserControls.WorkPlanes" xmlns:local="clr-namespace:StructureHelper.Windows.UserControls.WorkPlanes"
xmlns:uc="clr-namespace:StructureHelper.Windows.UserControls"
mc:Ignorable="d" mc:Ignorable="d"
d:DataContext="{d:DesignInstance local:WorkPlaneRootViewModel}" d:DataContext="{d:DesignInstance local:WorkPlaneRootViewModel}"
d:DesignHeight="450" d:DesignWidth="800"> d:DesignHeight="450" d:DesignWidth="800">
<DockPanel> <DockPanel>
<ToolBarTray DockPanel.Dock="Top"> <ToolBarTray DockPanel.Dock="Top">
<ToolBar> <ToolBar DataContext="{Binding SaveCopyViewModel, RelativeSource={RelativeSource AncestorType=local:WorkPlaneRoot}}">
<Button Style="{DynamicResource ToolButton}" Command="{Binding CopyToClipboardCommand}">
<Button.ToolTip>
<uc:ButtonToolTipEh HeaderText="Copy to clipboard"
IconContent="{StaticResource CopyToClipboard}"
DescriptionText="Copy chart to clipboard as image"/>
</Button.ToolTip>
<Viewbox>
<ContentControl ContentTemplate="{DynamicResource CopyToClipboard}"/>
</Viewbox>
</Button>
<Button Style="{DynamicResource ToolButton}" Command="{Binding SaveAsImageCommand}">
<Button.ToolTip>
<uc:ButtonToolTipEh HeaderText="Export to *.png"
IconContent="{StaticResource PngImage}"
DescriptionText="Export chart to *.png file"/>
</Button.ToolTip>
<Viewbox>
<ContentControl ContentTemplate="{DynamicResource PngImage}"/>
</Viewbox>
</Button>
</ToolBar> </ToolBar>
</ToolBarTray> </ToolBarTray>
<Grid> <Grid>
@@ -19,6 +39,7 @@
<RowDefinition Height="25"/> <RowDefinition Height="25"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" Background="White"> <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" Background="White">
<Grid x:Name="WorkPlaneGrid" Background="White">
<Canvas x:Name="RootCanvas" Width="{Binding WorkPlaneConfig.CanvasWidth}" Height="{Binding WorkPlaneConfig.CanvasHeight}"> <Canvas x:Name="RootCanvas" Width="{Binding WorkPlaneConfig.CanvasWidth}" Height="{Binding WorkPlaneConfig.CanvasHeight}">
<Canvas.RenderTransform> <Canvas.RenderTransform>
<TransformGroup> <TransformGroup>
@@ -67,6 +88,7 @@
StirrupByDensityTemplate="{StaticResource StirrupByDensityPrimitiveTemplate}" StirrupByDensityTemplate="{StaticResource StirrupByDensityPrimitiveTemplate}"
StirrupByInclinedRebarTemplate="{StaticResource StirrupByInclinedRebarPrimitiveTemplate}" StirrupByInclinedRebarTemplate="{StaticResource StirrupByInclinedRebarPrimitiveTemplate}"
ConcentratedForceTemplate="{StaticResource ConcentratedForcePrimitiveTemplate}" ConcentratedForceTemplate="{StaticResource ConcentratedForcePrimitiveTemplate}"
DistributedLoadTemplate="{StaticResource DistributedLoadPrimitiveTemplate}"
/> />
</ItemsControl.ItemTemplateSelector> </ItemsControl.ItemTemplateSelector>
@@ -80,6 +102,7 @@
</ItemsControl.ItemContainerStyle> </ItemsControl.ItemContainerStyle>
</ItemsControl> </ItemsControl>
</Canvas> </Canvas>
</Grid>
</ScrollViewer> </ScrollViewer>
<StatusBar Grid.Row="1"> <StatusBar Grid.Row="1">
<StatusBarItem> <StatusBarItem>

View File

@@ -1,4 +1,5 @@
using System; using StructureHelper.Windows.Graphs;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@@ -21,6 +22,8 @@ namespace StructureHelper.Windows.UserControls.WorkPlanes
public partial class WorkPlaneRoot : UserControl public partial class WorkPlaneRoot : UserControl
{ {
private Point? _lastPanPoint; private Point? _lastPanPoint;
public SaveCopyFWElementViewModel SaveCopyViewModel { get; } = new();
public WorkPlaneRoot() public WorkPlaneRoot()
{ {
InitializeComponent(); InitializeComponent();
@@ -28,6 +31,7 @@ namespace StructureHelper.Windows.UserControls.WorkPlanes
this.MouseDown += WorkPlaneRoot_MouseDown; this.MouseDown += WorkPlaneRoot_MouseDown;
this.MouseMove += WorkPlaneRoot_MouseMove; this.MouseMove += WorkPlaneRoot_MouseMove;
this.MouseUp += WorkPlaneRoot_MouseUp; this.MouseUp += WorkPlaneRoot_MouseUp;
SaveCopyViewModel.FrameWorkElement = WorkPlaneGrid;
} }

View File

@@ -1,9 +1,5 @@
using StructureHelper.Infrastructure; using StructureHelper.Infrastructure;
using System; using StructureHelper.Windows.Graphs;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelper.Windows.UserControls.WorkPlanes namespace StructureHelper.Windows.UserControls.WorkPlanes
{ {
@@ -11,5 +7,6 @@ namespace StructureHelper.Windows.UserControls.WorkPlanes
{ {
public WorkPlaneConfigViewModel WorkPlaneConfig { get; } = new(); public WorkPlaneConfigViewModel WorkPlaneConfig { get; } = new();
public PrimitiveCollectionViewModel PrimitiveCollection { get; } = new(); public PrimitiveCollectionViewModel PrimitiveCollection { get; } = new();
//public SaveCopyFWElementViewModel SaveCopyViewModel { get; } = new();
} }
} }