from Bi.BiList import CBiList from Common.CEnum import BI_DIR, SEG_TYPE from .EigenFX import CEigenFX from .SegConfig import CSegConfig from .SegListComm import CSegListComm class CSegListChan(CSegListComm): def __init__(self, seg_config=CSegConfig(), lv=SEG_TYPE.BI): super(CSegListChan, self).__init__(seg_config=seg_config, lv=lv) def do_init(self): # 删除末尾不确定的线段 while len(self) and not self.lst[-1].is_sure: _seg = self[-1] for bi in _seg.bi_list: bi.parent_seg = None if _seg.pre: _seg.pre.next = None self.lst.pop() if len(self): assert self.lst[-1].eigen_fx and self.lst[-1].eigen_fx.ele[-1] if not self.lst[-1].eigen_fx.ele[-1].lst[-1].is_sure: # 如果确定线段的分形的第三元素包含不确定笔,也需要重新算,不然线段分形元素的高低点可能不对 self.lst.pop() def update(self, bi_lst: CBiList): self.do_init() if len(self) == 0: self.cal_seg_sure(bi_lst, begin_idx=0) else: self.cal_seg_sure(bi_lst, begin_idx=self[-1].end_bi.idx+1) self.collect_left_seg(bi_lst) def cal_seg_sure(self, bi_lst: CBiList, begin_idx: int): up_eigen = CEigenFX(BI_DIR.UP, lv=self.lv) # 上升线段下降笔 down_eigen = CEigenFX(BI_DIR.DOWN, lv=self.lv) # 下降线段上升笔 last_seg_dir = None if len(self) == 0 else self[-1].dir for bi in bi_lst[begin_idx:]: fx_eigen = None if bi.is_down() and last_seg_dir != BI_DIR.UP: if up_eigen.add(bi): fx_eigen = up_eigen elif bi.is_up() and last_seg_dir != BI_DIR.DOWN: if down_eigen.add(bi): fx_eigen = down_eigen if len(self) == 0: # 尝试确定第一段方向,不要以谁先成为分形来决定,反例:US.EVRG if up_eigen.ele[1] is not None and bi.is_down(): last_seg_dir = BI_DIR.DOWN down_eigen.clear() elif down_eigen.ele[1] is not None and bi.is_up(): up_eigen.clear() last_seg_dir = BI_DIR.UP if up_eigen.ele[1] is None and last_seg_dir == BI_DIR.DOWN and bi.dir == BI_DIR.DOWN: last_seg_dir = None elif down_eigen.ele[1] is None and last_seg_dir == BI_DIR.UP and bi.dir == BI_DIR.UP: last_seg_dir = None if fx_eigen: self.treat_fx_eigen(fx_eigen, bi_lst) break def treat_fx_eigen(self, fx_eigen, bi_lst: CBiList): _test = fx_eigen.can_be_end(bi_lst) end_bi_idx = fx_eigen.GetPeakBiIdx() if _test in [True, None]: # None表示反向分型找到尾部也没找到 is_true = _test is not None # 如果是正常结束 if not self.add_new_seg(bi_lst, end_bi_idx, is_sure=is_true and fx_eigen.all_bi_is_sure()): # 防止第一根线段的方向与首尾值异常 self.cal_seg_sure(bi_lst, end_bi_idx+1) return self.lst[-1].eigen_fx = fx_eigen if is_true: self.cal_seg_sure(bi_lst, end_bi_idx + 1) else: self.cal_seg_sure(bi_lst, fx_eigen.lst[1].idx)