SBTChartsView.swift 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. //
  2. // SBTChartsView.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/2/27.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. extension UIImage{
  10. /**
  11. * 生成给你一张渐变色的图片
  12. * colors 颜色数组
  13. * rect 图片大小
  14. * 返回渐变图片
  15. */
  16. }
  17. struct BarIndexPath {
  18. var viewIndex : Int?
  19. var barIndex: Int?
  20. }
  21. class SBTChartsView: UIView{
  22. //读取超压电压~
  23. var arr0 : [Float]? = [Float]()
  24. var arr1 : [Float]? = [Float]()
  25. var arr2 : [Float]? = [Float]()
  26. var arr3 : [Float]? = [Float]()
  27. var arr4 : [Float]? = [Float]()
  28. var arr5 : [Float]? = [Float]()
  29. var arr6 : [Float]? = [Float]()
  30. var arr7 : [Float]? = [Float]()
  31. // var arr8 : [Float]? = [Float]()
  32. // var arr9 : [Float]? = [Float]()
  33. var weekData : [OneDayData]? {
  34. didSet{
  35. }
  36. }
  37. var lastButton:UIButton? = UIButton()
  38. var selectedIndex: Int? = 0
  39. func fillChartsData(_ weekData : [OneDayData]?) {
  40. arr0?.removeAll()
  41. arr1?.removeAll()
  42. arr2?.removeAll()
  43. arr3?.removeAll()
  44. arr4?.removeAll()
  45. arr5?.removeAll()
  46. if let arr = weekData {
  47. for i in 0..<arr.count {
  48. let oneDay = arr[i]
  49. let his_batteryVoltageMin = Float(oneDay.his_batteryVoltageMin!)// 蓄电池最低电压
  50. arr0?.append(his_batteryVoltageMin!)
  51. let his_batteryVoltageMax = Float(oneDay.his_batteryVoltageMax!)// 蓄电池最高电压
  52. arr1?.append(his_batteryVoltageMax!)
  53. //充电
  54. let his_chargingCurrentMax = Float(oneDay.his_chargingCurrentMax!)// 充电最大电流
  55. arr2?.append(his_chargingCurrentMax!)
  56. let his_generationCapacity = String(format: "%.3f", Double(oneDay.his_generationCapacity!)! * 0.001)// // 发电量
  57. // arr8?.append(his_generationCapacity! * 0.001)
  58. arr3?.append(Float(his_generationCapacity) as! Float)
  59. //放电
  60. let his_dischargeCurrentmax = Float(oneDay.his_dischargeCurrentmax!) // 放电最大电流
  61. arr4?.append(his_dischargeCurrentmax!)
  62. let his_dischargeCapacity = String(format: "%.3f", Double(oneDay.his_dischargeCapacity!)! * 0.001)// 放电量
  63. arr5?.append(Float(his_dischargeCapacity) as! Float)
  64. // log.debug("发点量--- \(his_generationCapacity)放电量 === \(his_dischargeCapacity)")
  65. }
  66. }
  67. configCharts()
  68. notificationChangeToolButton()
  69. let barIndex = AppShare.batIndexPath
  70. if barIndex != nil {
  71. if barIndex?.viewIndex == 0{
  72. batteryChartView.selectedIndex((barIndex?.barIndex)!)
  73. }else if barIndex?.viewIndex == 1 {
  74. chargeChartView.selectedIndex((barIndex?.barIndex)!)
  75. }else if barIndex?.viewIndex == 2 {
  76. dischargeChartView.selectedIndex((barIndex?.barIndex)!)
  77. }
  78. }
  79. }
  80. lazy var batteryChartView: DVBarChartView = {
  81. let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356 - 80 ))
  82. chartView.delegate = self
  83. chartView.barGap = 17
  84. chartView.barWidth = 33
  85. chartView.yAxisViewWidth = 50
  86. chartView.numberOfYAxisElements = 5
  87. chartView.xAxisTitleArray = self.dayArr
  88. chartView.backColor = UIColor.white
  89. chartView.axisColor = UIColor(hexString: "#E4E4E4")
  90. chartView.xValues = arr0 as? NSMutableArray
  91. chartView.xValues2 = arr1 as? NSMutableArray
  92. chartView.yAxisMaxValue = 7000 * 2; //
  93. chartView.isHidden = true
  94. chartView.tag = 100000
  95. // chartView.isLandspace = true
  96. chartView.draw()
  97. return chartView
  98. }()
  99. lazy var chargeChartView: DVBarChartView = {
  100. let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356 - 80 ))
  101. chartView.delegate = self
  102. chartView.barGap = 17
  103. chartView.barWidth = 33
  104. chartView.yAxisViewWidth = 50
  105. chartView.numberOfYAxisElements = 5
  106. chartView.xAxisTitleArray = self.dayArr
  107. chartView.backColor = UIColor.white
  108. chartView.axisColor = UIColor(hexString: "#E4E4E4")
  109. chartView.yAxisMaxValue = 2500;
  110. chartView.isHidden = true
  111. chartView.tag = 100001
  112. chartView.draw()
  113. return chartView
  114. }()
  115. lazy var dischargeChartView: DVBarChartView = {
  116. let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356 - 80 ))
  117. chartView.delegate = self
  118. chartView.barGap = 17
  119. chartView.barWidth = 33
  120. chartView.yAxisViewWidth = 50
  121. chartView.numberOfYAxisElements = 5
  122. chartView.xAxisTitleArray = self.dayArr
  123. chartView.backColor = UIColor.white
  124. chartView.axisColor = UIColor(hexString: "#E4E4E4")
  125. chartView.yAxisMaxValue = 2500;
  126. chartView.isHidden = true
  127. chartView.tag = 100002
  128. chartView.draw()
  129. return chartView
  130. }()
  131. // lazy var electricityChartView: DVBarChartView = {
  132. // let chartView = DVBarChartView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height:356 - 80 ))
  133. // chartView.barGap = 36
  134. // chartView.barWidth = 30
  135. // chartView.yAxisViewWidth = 50
  136. // chartView.numberOfYAxisElements = 5
  137. // chartView.xAxisTitleArray = self.dayArr
  138. // chartView.backColor = UIColor.white
  139. // chartView.axisColor = UIColor(hexString: "#E4E4E4")
  140. //
  141. // chartView.yAxisMaxValue = 65.535 * 2 ;
  142. // chartView.isHidden = true
  143. // chartView.tag = 100003
  144. // chartView.draw()
  145. // return chartView
  146. // }()
  147. lazy var toolbar: UIView = {
  148. let toolbar = UIView()
  149. toolbar.backgroundColor = UIColor.white
  150. toolbar.layer.masksToBounds = true
  151. toolbar.layer.cornerRadius = 15
  152. toolbar.layer.borderWidth = 1
  153. toolbar.layer.borderColor = UIColor(hexString: "#DEDEDE")?.cgColor
  154. return toolbar
  155. }()
  156. let btnTitles = ["Battery".da_localizedStr(),"Charge".da_localizedStr(),"Discharge".da_localizedStr()]
  157. var dayArr :[String]?
  158. override init(frame: CGRect) {
  159. super.init(frame: frame)
  160. //self.backgroundColor = UIColor.blue
  161. dayArr = [String]()
  162. let first = nowTime("yyyy-M-d")
  163. let second = getLastDay(first)
  164. let third = getLastDay(second)
  165. let foreth = getLastDay(third)
  166. let fifth = getLastDay(foreth)
  167. let sixth = getLastDay(fifth)
  168. let seventh = getLastDay(sixth)
  169. let eighth = getLastDay(seventh)
  170. dayArr?.append("Today".da_localizedStr())
  171. dayArr?.append("Yesterday".da_localizedStr())
  172. dayArr?.append(third.subString(start: 5))
  173. dayArr?.append(foreth.subString(start: 5))
  174. dayArr?.append(fifth.subString(start: 5))
  175. dayArr?.append(sixth.subString(start: 5))
  176. dayArr?.append(seventh.subString(start: 5))
  177. dayArr?.append(eighth.subString(start: 5))
  178. createUI()
  179. }
  180. required init?(coder aDecoder: NSCoder) {
  181. fatalError("init(coder:) has not been implemented")
  182. }
  183. func createUI() {
  184. addSubview(toolbar)
  185. toolbar.snp.makeConstraints { (make) in
  186. make.bottom.equalToSuperview().offset(-30)
  187. make.left.equalToSuperview().offset(20)
  188. make.right.equalToSuperview().offset(-20)
  189. make.height.equalTo(30)
  190. }
  191. let buttonW = ( KSCREENWIDTH - 30) / 3
  192. let buttonH = 30
  193. for i in 0..<3 {
  194. let btn = UIButton(type: .custom)
  195. btn.setTitle(btnTitles[i], for: .normal)
  196. btn.setTitleColor(UIColor(hexString: "#989898"), for: .normal)
  197. btn.setBackgroundImage(UIImage(named: "toorbar_normal"), for: .normal)
  198. btn.titleLabel?.font = UIFont(name: PingFangSC_Medium, size: 11)
  199. btn.setTitleColor(UIColor(hexString: "#FFFFFF"), for: .selected)
  200. btn.setBackgroundImage(UIImage(named: "toorbar_selected"), for: .selected)
  201. btn.frame = CGRect(x: CGFloat(i) * buttonW, y: 0, width: buttonW, height: CGFloat(buttonH))
  202. btn.tag = 5000 + i
  203. btn.layer.masksToBounds = true
  204. btn.layer.cornerRadius = 15
  205. btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
  206. if i == 0 {
  207. btn.isSelected = true
  208. btn.setTitleColor(UIColor(hexString: "#FFFFFF"), for: .selected)
  209. btn.setBackgroundImage(UIImage(named: "toorbar_selected"), for: .selected) // 默认选择第一个
  210. show(batteryChartView)
  211. }
  212. toolbar.addSubview(btn)
  213. }
  214. addSubview(batteryChartView)
  215. addSubview(chargeChartView)
  216. addSubview(dischargeChartView)
  217. // addSubview(electricityChartView)
  218. batteryChartView.snp.makeConstraints { (make) in
  219. make.right.top.left.equalToSuperview()
  220. make.bottom.equalTo(toolbar.snp.top).offset(-40)
  221. }
  222. chargeChartView.snp.makeConstraints { (make) in
  223. make.right.top.left.equalToSuperview()
  224. make.bottom.equalTo(toolbar.snp.top).offset(-40)
  225. }
  226. dischargeChartView.snp.makeConstraints { (make) in
  227. make.right.top.left.equalToSuperview()
  228. make.bottom.equalTo(toolbar.snp.top).offset(-40)
  229. }
  230. }
  231. @objc func btnClick(_ sender : UIButton) {
  232. for i in 0..<3 {
  233. let btn : UIButton = toolbar.viewWithTag((i + 5000)) as! UIButton
  234. btn.isSelected = false
  235. }
  236. sender.isSelected = true
  237. let index = sender.tag - 5000
  238. if index == 0 {
  239. show(batteryChartView)
  240. }else if index == 1 {
  241. show(chargeChartView)
  242. }else if index == 2 {
  243. show(dischargeChartView)
  244. }
  245. // else if index == 3 {
  246. // show(electricityChartView)
  247. // }
  248. AppShare.toolbarSelectedIndex = index
  249. }
  250. @objc func notificationChangeToolButton() {
  251. for i in 0..<3 {
  252. let btn : UIButton = toolbar.viewWithTag((i + 5000)) as! UIButton
  253. btn.isSelected = false
  254. }
  255. let selectedIndex = AppShare.toolbarSelectedIndex
  256. let button : UIButton = toolbar.viewWithTag((selectedIndex! + 5000)) as! UIButton
  257. button.isSelected = true
  258. if selectedIndex == 0 {
  259. show(batteryChartView)
  260. }else if selectedIndex == 1 {
  261. show(chargeChartView)
  262. }else if selectedIndex == 2 {
  263. show(dischargeChartView)
  264. }
  265. }
  266. func show(_ chartView:DVBarChartView) {
  267. batteryChartView.isHidden = true
  268. chargeChartView.isHidden = true
  269. dischargeChartView.isHidden = true
  270. // electricityChartView.isHidden = true
  271. chartView.isHidden = false
  272. }
  273. func image(_ color :UIColor) -> UIImage {
  274. let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
  275. UIGraphicsBeginImageContext(rect.size)
  276. let context = UIGraphicsGetCurrentContext()
  277. context?.setFillColor(color.cgColor)
  278. context?.fill(rect)
  279. let image = UIGraphicsGetImageFromCurrentImageContext()
  280. UIGraphicsEndImageContext()
  281. return image!
  282. }
  283. func gradientImage(_ colors: [UIColor]?, rect: CGRect) -> UIImage? {
  284. if colors?.count == 0 || rect.equalTo(CGRect.zero){
  285. return nil
  286. }
  287. let gradientLayer = CAGradientLayer()
  288. gradientLayer.frame = rect
  289. gradientLayer.startPoint = CGPoint(x: 0, y: 0)
  290. gradientLayer.endPoint = CGPoint(x: 1, y: 0)
  291. let mutColors = NSMutableArray(capacity: colors!.count)
  292. for color in colors! {
  293. mutColors.add(color.cgColor)
  294. }
  295. gradientLayer.colors = (NSArray(array: mutColors) as! [Any])
  296. UIGraphicsBeginImageContextWithOptions(gradientLayer.frame.size, gradientLayer.isOpaque, 0)
  297. let outputImage = UIGraphicsGetImageFromCurrentImageContext()
  298. UIGraphicsEndImageContext()
  299. return outputImage
  300. }
  301. //MARK : 设置数据
  302. func configCharts() {
  303. for i in 0..<3 {
  304. let ccc : DVBarChartView = viewWithTag(100000 + i) as! DVBarChartView
  305. ccc.removeAllPlot()
  306. ccc.reloadInputViews()
  307. if i == 0 {
  308. ccc.addPlot(arr0)
  309. ccc.addPlot2(arr1)
  310. var TitleArr0 = [String]()
  311. TitleArr0.removeAll()
  312. for value in arr0! {
  313. let title = String(format: "%@\n%.1fV","Minimum_battery_voltage".da_localizedStr(), value)
  314. TitleArr0.append(title)
  315. }
  316. var TitleArr1 = [String]()
  317. TitleArr1.removeAll()
  318. for value in arr1! {
  319. let title = String(format: "%@\n%.1fV","Maximum_battery_voltage".da_localizedStr(), value)
  320. TitleArr1.append(title)
  321. }
  322. ccc.xTitles = TitleArr0
  323. ccc.xTitles2 = TitleArr1
  324. //判断最大值
  325. let max0 = CGFloat((arr0?.max())!)
  326. let max1 = CGFloat((arr1?.max())!)
  327. let yAxisMaxValue = max0 > max1 ? max0 : max1
  328. // ccc.yAxisMaxValue = yAxisMaxValue * 2
  329. ccc.legendTitle1 = "Maximum_battery_voltage".da_localizedStr()
  330. ccc.legendTitle2 = "Minimum_battery_voltage".da_localizedStr()
  331. }else if i == 1 {
  332. ccc.addPlot(arr2)
  333. ccc.addPlot2(arr3)
  334. var TitleArr0 = [String]()
  335. TitleArr0.removeAll()
  336. for value in arr2! {
  337. let title = String(format: "%@\n%.2fA","Maximum_current".da_localizedStr(), value)
  338. TitleArr0.append(title)
  339. }
  340. var TitleArr1 = [String]()
  341. TitleArr1.removeAll()
  342. for value in arr3! {
  343. let title = String(format: "%@\n%.3fkWh","Power_ge".da_localizedStr(), value)
  344. TitleArr1.append(title)
  345. }
  346. ccc.xTitles = TitleArr1
  347. ccc.xTitles2 = TitleArr0
  348. //判断最大值
  349. let max0 = CGFloat((arr2?.max())!)
  350. let max1 = CGFloat((arr3?.max())!)
  351. let a = [max0,max1]
  352. ccc.legendTitle1 = "Maximum_current".da_localizedStr()
  353. ccc.legendTitle2 = "Power_ge".da_localizedStr()
  354. // ccc.yAxisMaxValue = a.max()! * 3
  355. }else if i == 2 {
  356. ccc.addPlot(arr4)
  357. ccc.addPlot2(arr5)
  358. var TitleArr0 = [String]()
  359. TitleArr0.removeAll()
  360. for value in arr4! {
  361. let title = String(format: "%@\n%.2fA","Maximum_discharge_current".da_localizedStr(), value)
  362. TitleArr0.append(title)
  363. }
  364. var TitleArr1 = [String]()
  365. TitleArr1.removeAll()
  366. for value in arr5! {
  367. let title = String(format: "%@\n%.3fkWh","Discharge_amount".da_localizedStr(), value)
  368. TitleArr1.append(title)
  369. }
  370. ccc.xTitles = TitleArr1
  371. ccc.xTitles2 = TitleArr0
  372. ccc.legendTitle1 = "Maximum_discharge_current".da_localizedStr()
  373. ccc.legendTitle2 = "Discharge_amount".da_localizedStr()
  374. // ccc.yAxisMaxValue = a.max()! * 3
  375. }
  376. ccc.draw()
  377. }
  378. }
  379. }
  380. extension SBTChartsView :DVBarChartViewDelegate{
  381. func barChartView(_ barChartView: DVBarChartView!, didSelectedBarAt index: Int) {
  382. AppShare.batIndexPath = BarIndexPath(viewIndex: barChartView.tag - 100000, barIndex: index)
  383. log.debug( AppShare.batIndexPath)
  384. }
  385. }