package Ġjump aku . cur ves . f sc . snap . con ic section Ċ Ċ import Ġjump aku . commons . control . or Default Ċ import Ġjump aku . commons . control . result Ċ import Ġjump aku . commons . control . to Option Ċ import Ġjump aku . cur ves . core . curve . bezier . Con ic Section Ċ import Ġjump aku . cur ves . core . curve . bsp line . BS pline Ċ import Ġjump aku . cur ves . core . fuzzy . Grade Ċ import Ġjump aku . cur ves . core . transform . Cal ibrate Ċ import Ġjump aku . cur ves . f sc . identify . primitive . Curve Class Ċ import Ġjump aku . cur ves . f sc . identify . primitive . re parametrize Ċ import Ġjump aku . cur ves . f sc . snap . Grid Ċ import Ġjump aku . cur ves . f sc . snap . point . Point Snap per Ċ import Ġjump aku . cur ves . f sc . snap . point . transform To World ĊĊ Ċ class ĠCon ic Section Snap per < C Ġ: ĠFeature Points Combin ator >( ĊĠĠĠĠĠĠĠ Ġval Ġpoint Snap per : ĠPoint Snap per , ĊĠĠĠĠĠĠĠ Ġval Ġfeature Points Combin ator : ĠC Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġsnap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid : ĠGrid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon ic Section : ĠCon ic Section , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Class : ĠCurve Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevaluator : Ġ( Con ic Section Snap Result . Candidate ) Ġ-> ĠGr ade Ġ= Ġevaluate With Reference ( con ic Section ) ĊĠĠĠ Ġ): ĠCon ic Section Snap Result Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( curve Class . is Con ic Section ) Ġ{ Ġ" curve Class ($ curve Class ) Ġmust Ġbe Ġcon ic Ġsection " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġenumerate ( grid , Ġcon ic Section , Ġcurve Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠCon ic Section Snap Result . Evalu ated Candidate ( evaluator ( it ), Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġit . grade Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsn apped Ġ= Ġcandidates . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Option () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . grade . value Ġ> Ġ 0 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcon ic Section . affine Transform ( it . candidate . transform ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCon ic Section Snap Result ( sn apped , Ġcandidates ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenumerate ( grid : ĠGrid , Ġcon ic Section : ĠCon ic Section , Ġcurve Class : ĠCurve Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠList < Con ic Section Snap Result . Candidate > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( curve Class . is Con ic Section ) Ġ{ Ġ" curve Class ($ curve Class ) Ġmust Ġbe Ġcon ic Ġsection " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Class . is Linear Ġ-> Ġenumerate Linear Candidate ( grid , Ġcon ic Section , Ġcurve Class . isOpen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Class . is Circular Ġ-> Ġenumerate Circular Candidate ( grid , Ġcon ic Section , Ġcurve Class . isOpen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Class . is El li ptic Ġ-> Ġenumerate El li ptic Candidate ( grid , Ġcon ic Section , Ġcurve Class . isOpen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenumerate Linear Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid : ĠGrid , Ġcon ic Section : ĠCon ic Section , ĠisOpen : ĠBoolean ĊĠĠĠ Ġ): ĠList < Con ic Section Snap Result . Candidate > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Points Combin ator . linear Combin ations ( con ic Section , ĠisOpen ). flatMap Ġ{ Ġ( f 0 , Ġf 1 ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 0 Ġ= Ġpoint Snap per . snap ( grid , Ġf 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġpoint Snap per . snap ( grid , Ġf 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal ibrate Ġ= ĠCal ibrate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf 0 Ġto Ġs 0 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 Ġto Ġs 1 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 1 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon ic Section Snap Result . Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Con ic Section Snap Result . Sn apped Point ( f 0 , Ġs 0 ), ĠCon ic Section Snap Result . Sn apped Point ( f 1 , Ġs 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal ibrate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenumerate Circular Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid : ĠGrid , Ġcon ic Section : ĠCon ic Section , ĠisOpen : ĠBoolean ĊĠĠĠ Ġ): ĠList < Con ic Section Snap Result . Candidate > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Points Combin ator . circular Combin ations ( con ic Section , ĠisOpen ). flatMap Ġ{ Ġ( f 0 , Ġf 1 , Ġfn ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 0 Ġ= Ġpoint Snap per . snap ( grid , Ġf 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġpoint Snap per . snap ( grid , Ġf 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsn Ġ= Ġpoint Snap per . snap ( grid , Ġfn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġsn . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġfn Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. normal ( s 0 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs 1 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 1 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġfn . normal ( f 0 , Ġf 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal ibrate Ġ= ĠCal ibrate . similarity With Normal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf 0 Ġto Ġs 0 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 Ġto Ġs 1 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . or Throw () Ġto Ġn . or Throw ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon ic Section Snap Result . Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Con ic Section Snap Result . Sn apped Point ( f 0 , Ġs 0 ), ĠCon ic Section Snap Result . Sn apped Point ( f 1 , Ġs 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal ibrate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenumerate El li ptic Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid : ĠGrid , Ġcon ic Section : ĠCon ic Section , ĠisOpen : ĠBoolean ĊĠĠĠ Ġ): ĠList < Con ic Section Snap Result . Candidate > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Points Combin ator . elli ptic Combin ations ( con ic Section , ĠisOpen ). flatMap Ġ{ Ġ( f 0 , Ġf 1 , Ġf 2 ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 0 Ġ= Ġpoint Snap per . snap ( grid , Ġf 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġpoint Snap per . snap ( grid , Ġf 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 2 Ġ= Ġpoint Snap per . snap ( grid , Ġf 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal ibrate Ġ= ĠCal ibrate ( f 0 Ġto Ġs 0 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 Ġto Ġs 1 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf 2 Ġto Ġs 2 . map Ġ{ Ġgrid . transform To World ( it ) Ġ}. or Default Ġ{ Ġf 2 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon ic Section Snap Result . Candidate ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon ic Section Snap Result . Sn apped Point ( f 0 , Ġs 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon ic Section Snap Result . Sn apped Point ( f 1 , Ġs 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon ic Section Snap Result . Sn apped Point ( f 2 , Ġs 2 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal ibrate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġevaluate With F sc ( f sc : ĠB Spline , Ġoriginal : ĠCon ic Section , Ġn F mps : ĠInt Ġ= Ġ 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġ( Con ic Section Snap Result . Candidate ) Ġ-> ĠGr ade Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre parametrize ( original . affine Transform ( it . transform )). is Possible ( re parametrize ( f sc ), Ġn F mps ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġevaluate With Reference ( original : ĠCon ic Section , Ġn F mps : ĠInt Ġ= Ġ 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġ( Con ic Section Snap Result . Candidate ) Ġ-> ĠGr ade Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre parametrize ( original . affine Transform ( it . transform )). is Possible ( re parametrize ( original ), Ġn F mps ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ