forked from 1b-agent/opencadstudio-upstream
feat(fillet): allow radius from two picked points
This commit is contained in:
1 parent
8a45a84c43
commit
5d77c2dd00
1 file changed
+71
-8
@@ -1296,7 +1296,14 @@ fn compute_chamfer(
|
|||||||
enum FilletStep {
|
enum FilletStep {
|
||||||
First,
|
First,
|
||||||
Polyline,
|
Polyline,
|
||||||
|
|
||||||
|
// Radius may be typed directly or measured by picking two points.
|
||||||
WaitingForRadius,
|
WaitingForRadius,
|
||||||
|
|
||||||
|
RadiusSecondPoint {
|
||||||
|
first: DVec3,
|
||||||
|
},
|
||||||
|
|
||||||
Second {
|
Second {
|
||||||
h1: Handle,
|
h1: Handle,
|
||||||
e1: FilletEntity,
|
e1: FilletEntity,
|
||||||
@@ -1370,6 +1377,21 @@ impl FilletCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl CadCommand for FilletCommand {
|
impl CadCommand for FilletCommand {
|
||||||
|
fn on_mouse_move(&mut self, pt: DVec3) -> Option<WireModel> {
|
||||||
|
let FilletStep::RadiusSecondPoint { first } = self.step else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
|
||||||
|
Some(WireModel::solid_f64(
|
||||||
|
"fillet_radius_preview".into(),
|
||||||
|
vec![
|
||||||
|
[first.x, first.y, first.z],
|
||||||
|
[pt.x, pt.y, pt.z],
|
||||||
|
],
|
||||||
|
WireModel::CYAN,
|
||||||
|
false,
|
||||||
|
))
|
||||||
|
}
|
||||||
fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
"FILLET"
|
"FILLET"
|
||||||
}
|
}
|
||||||
@@ -1387,7 +1409,15 @@ impl CadCommand for FilletCommand {
|
|||||||
)
|
)
|
||||||
.into_owned(),
|
.into_owned(),
|
||||||
FilletStep::WaitingForRadius => {
|
FilletStep::WaitingForRadius => {
|
||||||
crate::tf!("FILLET Enter fillet radius <{:.4}>:", self.radius).into_owned()
|
crate::tf!(
|
||||||
|
"FILLET Specify fillet radius or first point <{:.4}>:",
|
||||||
|
self.radius
|
||||||
|
)
|
||||||
|
.into_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
FilletStep::RadiusSecondPoint { .. } => {
|
||||||
|
crate::t!("FILLET Specify second point for radius:").into_owned()
|
||||||
}
|
}
|
||||||
FilletStep::Second { .. } => {
|
FilletStep::Second { .. } => {
|
||||||
crate::tf!(
|
crate::tf!(
|
||||||
@@ -1410,7 +1440,9 @@ impl CadCommand for FilletCommand {
|
|||||||
FilletStep::Second { .. } => {
|
FilletStep::Second { .. } => {
|
||||||
vec![CmdOption::new("Radius", "R")]
|
vec![CmdOption::new("Radius", "R")]
|
||||||
}
|
}
|
||||||
FilletStep::Polyline | FilletStep::WaitingForRadius => vec![],
|
FilletStep::Polyline
|
||||||
|
| FilletStep::WaitingForRadius
|
||||||
|
| FilletStep::RadiusSecondPoint { .. } => vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1475,12 +1507,17 @@ impl CadCommand for FilletCommand {
|
|||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
FilletStep::Polyline => None,
|
FilletStep::Polyline
|
||||||
|
| FilletStep::RadiusSecondPoint { .. } => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn needs_entity_pick(&self) -> bool {
|
fn needs_entity_pick(&self) -> bool {
|
||||||
!matches!(self.step, FilletStep::WaitingForRadius)
|
!matches!(
|
||||||
|
self.step,
|
||||||
|
FilletStep::WaitingForRadius
|
||||||
|
| FilletStep::RadiusSecondPoint { .. }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_entity_pick(&mut self, handle: Handle, pt: DVec3) -> CmdResult {
|
fn on_entity_pick(&mut self, handle: Handle, pt: DVec3) -> CmdResult {
|
||||||
@@ -1490,7 +1527,11 @@ impl CadCommand for FilletCommand {
|
|||||||
let click = [pt.x as f64, pt.y as f64]; // drawing plane is world XY
|
let click = [pt.x as f64, pt.y as f64]; // drawing plane is world XY
|
||||||
|
|
||||||
match &self.step {
|
match &self.step {
|
||||||
FilletStep::WaitingForRadius => return CmdResult::NeedPoint,
|
FilletStep::WaitingForRadius
|
||||||
|
| FilletStep::RadiusSecondPoint { .. } => {
|
||||||
|
return CmdResult::NeedPoint;
|
||||||
|
}
|
||||||
|
|
||||||
FilletStep::Polyline => {
|
FilletStep::Polyline => {
|
||||||
let poly = self
|
let poly = self
|
||||||
.entity_index
|
.entity_index
|
||||||
@@ -1586,7 +1627,8 @@ impl CadCommand for FilletCommand {
|
|||||||
let click = [pt.x as f64, pt.y as f64];
|
let click = [pt.x as f64, pt.y as f64];
|
||||||
|
|
||||||
match &self.step {
|
match &self.step {
|
||||||
FilletStep::WaitingForRadius => vec![],
|
FilletStep::WaitingForRadius
|
||||||
|
| FilletStep::RadiusSecondPoint { .. } => vec![],
|
||||||
FilletStep::Polyline => {
|
FilletStep::Polyline => {
|
||||||
let preview = self
|
let preview = self
|
||||||
.entity_index
|
.entity_index
|
||||||
@@ -1677,8 +1719,29 @@ impl CadCommand for FilletCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_point(&mut self, _pt: DVec3) -> CmdResult {
|
fn on_point(&mut self, pt: DVec3) -> CmdResult {
|
||||||
CmdResult::NeedPoint
|
match self.step {
|
||||||
|
FilletStep::WaitingForRadius => {
|
||||||
|
// First point of the temporary radius measurement.
|
||||||
|
self.step = FilletStep::RadiusSecondPoint { first: pt };
|
||||||
|
CmdResult::NeedPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
FilletStep::RadiusSecondPoint { first } => {
|
||||||
|
let radius = first.distance(pt);
|
||||||
|
|
||||||
|
// Ignore an accidental zero-length measurement.
|
||||||
|
if radius > 1.0e-9 {
|
||||||
|
self.radius = radius;
|
||||||
|
defaults::set_fillet_radius(radius);
|
||||||
|
self.resume_after_radius();
|
||||||
|
}
|
||||||
|
|
||||||
|
CmdResult::NeedPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => CmdResult::NeedPoint,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fn on_entity_replaced(&mut self, _old: Handle, new_handles: &[Handle]) {
|
fn on_entity_replaced(&mut self, _old: Handle, new_handles: &[Handle]) {
|
||||||
let mut handles = new_handles.iter().copied();
|
let mut handles = new_handles.iter().copied();
|
||||||
|
|||||||
Reference in new issue
Block a user