diff --git a/CMakeLists.txt b/CMakeLists.txt index 61fd995c9..e63fef1e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.6) project(LC) +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(WITH_QT_UI "With QT user interface" ON) diff --git a/lcUILua/createActions/circleoperations.lua b/lcUILua/createActions/circleoperations.lua index c9970139f..4ea63664c 100644 --- a/lcUILua/createActions/circleoperations.lua +++ b/lcUILua/createActions/circleoperations.lua @@ -1,5 +1,8 @@ CircleOperations = {} CircleOperations.__index = CircleOperations +local Circle_FirstPoint +local Circle_SecondPoint +local Circle_ThirdPoint setmetatable(CircleOperations, { __index = CreateOperations, @@ -12,19 +15,36 @@ setmetatable(CircleOperations, { function CircleOperations:_init(id) CreateOperations._init(self, id, lc.builder.CircleBuilder, "enterCenter") - + cli_get_text(self.target_widget, true) self.builder:setRadius(10) - message("CIRCLE", self.target_widget) + Circle_FirstPoint = nil + Circle_SecondPoint = nil + Circle_ThirdPoint = nil + message("CIRCLE1", self.target_widget) + message("Options: 2P, 3P, TTT, TTR", self.target_widget) message("Provide Center Point:", self.target_widget) end function CircleOperations:enterCenter(eventName, data) if(eventName == "point") then self.builder:setCenter(data["position"]) - message("Options: , Diameter", self.target_widget) + message("Options: Radius , Diameter", self.target_widget) message("Provide Radius:", self.target_widget) - cli_get_text(self.target_widget, true) self.step = "enterRadius" + elseif(eventName == "text") then + if ((data["text"]) == "2" or string.lower(data["text"]) == "2p") then + message("Provide Diameter Start Point:",self.target_widget) + self.step = "CircleWith2Points" + elseif ((data["text"]) == "3" or string.lower(data["text"]) == "3p") then + message("Provide Frist Point:",self.target_widget) + self.step = "CircleWith3Points" + elseif (string.lower(data["text"]) == "t" or string.lower(data["text"]) == "ttt") then + message("Provide Frist Tangent:",self.target_widget) + self.step = "CircleWith3Tans" + elseif (string.lower(data["text"]) == "r" or string.lower(data["text"]) == "ttr") then + message("Provide Frist Tangent:",self.target_widget) + self.step = "CircleWith2Tans" + end end end @@ -68,4 +88,51 @@ function CircleOperations:enterDiameter(eventName, data) if(eventName == "point") then self:createEntity() end +end + +function CircleOperations:CircleWith2Points(eventName, data) + if (eventName == "point" and not Circle_FirstPoint) then + Circle_FirstPoint = data['position'] + elseif (eventName == "mouseMove" and Circle_FirstPoint) then + self.builder:setCenter(Circle_FirstPoint:mid(data["position"])) + self.builder:setRadius(Circle_FirstPoint:distanceTo(data["position"]) / 2) + elseif (eventName == "point" and Circle_FirstPoint) then + self.builder:setCenter(Circle_FirstPoint:mid(data["position"])) + self.builder:setRadius(Circle_FirstPoint:distanceTo(data["position"]) / 2) + self:createEntity() + Circle_FirstPoint = nil + end +end + +function CircleOperations:CircleWith3Points(eventName, data) + if (eventName == "point" and not Circle_FirstPoint) then + Circle_FirstPoint = data['position'] + message("Provide Second Point:",self.target_widget) + elseif(eventName == "point" and Circle_FirstPoint and not Circle_SecondPoint) then + message("Provide Third Point:",self.target_widget) + Circle_SecondPoint = data['position'] + elseif(eventName == "point" and Circle_FirstPoint and Circle_SecondPoint and not Circle_ThirdPoint) then + Circle_ThirdPoint = data['position'] + self.builder:setCenter(self:Circumcenter(Circle_FirstPoint,Circle_SecondPoint,Circle_ThirdPoint)) + self.builder:setRadius(self.builder:center():distanceTo(Circle_ThirdPoint)) + self:createEntity() + end +end + +function CircleOperations:CircleWith3Tans(eventName, data) + message("TODO:3 Tan Circle.",self.target_widget) +end + +function CircleOperations:CircleWith2Tans(eventName, data) + message("TODO:2 Tan Circle.",self.target_widget) +end + +function CircleOperations:Circumcenter(Point1,Point2,Point3) + local Angle1=Point1:angleBetween(Point2,Point3) + local Angle2=Point2:angleBetween(Point3,Point1) + local Angle3=Point3:angleBetween(Point1,Point2) + local X = (Point1:x() * math.sin(2 * Angle1) + Point2:x() * math.sin(2 * Angle2) + Point3:x() * math.sin(2 * Angle3) ) / ( math.sin(2 * Angle1) + math.sin(2 * Angle2) + math.sin(2 * Angle3)) + local Y = (Point1:y() * math.sin(2 * Angle1) + Point2:y() * math.sin(2 * Angle2) + Point3:y() * math.sin(2 * Angle3) ) / ( math.sin(2 * Angle1) + math.sin(2 * Angle2) + math.sin(2 * Angle3)) + local Output=lc.geo.Coordinate(X,Y) + return Output end \ No newline at end of file