/// <summary> /// 找多个转接环 /// </summary> /// <param name="lens">镜头</param> /// <param name="focus">调焦环</param> /// <param name="upRing">上端(相机)接口</param> /// <param name="endRing">下端(镜头)接口</param> /// <param name="minLen">最小长度</param> /// <param name="maxLen">最大长度</param> /// <returns></returns> private void findAdpater(CameraLens lens, RingMedium focus, int upRing, int endRing, float minLen, float maxLen) { if (upRing == endRing) {//不需要转接环 this.FindExtend(lens, focus, adapterVisitedList, endRing, minLen, maxLen); } foreach (RingMedium item in adapterList) { if (maxLen <= 0) {//上一层已经结束 this.adapterVisitedList.RemoveAt(adapterVisitedList.Count - 1); break; } if (item.InterUp == upRing && item.Length < maxLen) { this.adapterVisitedList.Add(item); if (item.InterDown == endRing) {//找到合适 this.FindExtend(lens, focus, adapterVisitedList, endRing, minLen - item.Length, maxLen - item.Length); } else {//查找未结束 this.findAdpater(lens, focus, item.InterDown, endRing, minLen - item.Length, maxLen - item.Length); } } } }
public bool InsertOneItem(ValueType item) { CameraLens info = (CameraLens)item; string strSql = @"insert into camLens (name,imgName,number,resoLength,resoWidth,connector,focus,flange,length,hh,ratioMin,ratioMax,target,weight,contrast,distort) values (@name,@imgName,@number,@resoLength,@resoWidth,@connector,@focus,@flange,@length,@hh,@ratioMin,@ratioMax,@target,@weight,@contrast,@distort)"; List <SQLiteParameter> paraList = new List <SQLiteParameter>(); paraList.Add(SQLiteHelper.CreateParameter("@name", DbType.String, info.Name)); paraList.Add(SQLiteHelper.CreateParameter("@imgName", DbType.String, info.ImgName)); paraList.Add(SQLiteHelper.CreateParameter("@number", DbType.String, info.Number)); paraList.Add(SQLiteHelper.CreateParameter("@resoLength", DbType.Int32, info.ResolutionLength)); paraList.Add(SQLiteHelper.CreateParameter("@resoWidth", DbType.Int32, info.ResolutionWidth)); paraList.Add(SQLiteHelper.CreateParameter("@connector", DbType.Int32, info.Connector)); paraList.Add(SQLiteHelper.CreateParameter("@focus", DbType.Single, info.Focus)); paraList.Add(SQLiteHelper.CreateParameter("@flange", DbType.Single, info.Flange)); paraList.Add(SQLiteHelper.CreateParameter("@length", DbType.Single, info.Length)); paraList.Add(SQLiteHelper.CreateParameter("@hh", DbType.Single, info.HH)); paraList.Add(SQLiteHelper.CreateParameter("@ratioMin", DbType.Single, info.RatioMin)); paraList.Add(SQLiteHelper.CreateParameter("@ratioMax", DbType.Single, info.RatioMax)); paraList.Add(SQLiteHelper.CreateParameter("@target", DbType.Single, info.Target)); paraList.Add(SQLiteHelper.CreateParameter("@weight", DbType.Int32, info.Weight)); paraList.Add(SQLiteHelper.CreateParameter("@contrast", DbType.Int32, info.Contrast)); paraList.Add(SQLiteHelper.CreateParameter("@distort", DbType.Int32, info.Distort)); SQLiteCommand command = SQLiteHelper.CreateCommand(this.STR_CONNECTION, strSql, paraList.ToArray()); return(SQLiteHelper.ExecuteNonQuery(command) > 0); }
private bool CombinationStructDataList(CameraLens lens, List <List <RingMedium> > allList, bool showAll = false) { bool finish = showAll || allList.Count <= 1; if (!finish) { return(finish); } foreach (List <RingMedium> itemList in allList) { List <RingMedium> ringsTmp = new List <RingMedium>(itemList); //ringsTmp.RemoveAt(ringsTmp.Count - 1); RingResults oneResult = new RingResults() { Idx = this.resultsFound.Count + 1, Lens = lens, ringList = ringsTmp }; if (DateTime.Now.Month <= 6 && this.resultsFound.Count < 100000) { this.resultsFound.Add(oneResult); } } return(finish); }
private void CombinationStruct(CameraLens lens, RingMedium focus, List <RingMedium> adapter, List <RingMedium> extend) { List <RingMedium> adapterTmp = new List <RingMedium>(adapter); List <RingMedium> extendTmp = new List <RingMedium>(extend); RingResult oneResult = new RingResult() { Idx = this.results.Count + 1, Lens = lens, Focus = focus, AdapterList = adapterTmp, ExtendList = extendTmp }; this.results.Add(oneResult); }
private float getMustExtendLength(RingMedium focus, CameraLens lens) { float range = 0f; if (lens.Name.Contains("5.6/120") && (focus.Name.StartsWith("Smart Focus 23") || focus.Name.StartsWith("Smart Focus 7"))) { range = 25f; } else if (focus.Name.StartsWith("Smart Focus 23")) { range = 10f; } return(range); }
private void FindAllRing(CameraLens lens, List <RingMedium> current, int interUp, int interDown, float lengthMin, float lengthMax, float target) { foreach (RingMedium item in this.ringList) { if (//调焦环:最多有一个 item.RingType == enumProductType.Focus && current != null && current.Find(itmp => itmp.RingType == enumProductType.Focus).Idx > 0 || //调焦环:相机靶面 >= 56,仅用smart focus 23 item.RingType == enumProductType.Focus && target >= 56 && item.Name != "Smart Focus 23" && !lens.Name.StartsWith("Xenon") || //调焦环:名字以Xenon-Zirconia开头的镜头,用V48 to V70 item.RingType == enumProductType.Focus && lens.Name.StartsWith("Xenon-Zirconia") && !item.Name.Equals("V48 to V70") || //调焦环:Xenon-sapphire,xenon-Diamond系列不需要聚焦环 item.RingType == enumProductType.Focus && (lens.Name.StartsWith("Xenon-Diamond") || lens.Name.StartsWith("Xenon Sapphire")) || //转接环:同一规格仅出现一次 item.RingType == enumProductType.Adapter && current != null && current.Find(itmp => itmp.RingType == enumProductType.Adapter && itmp.InterUp == item.InterUp && itmp.InterDown == item.InterDown).Idx > 0 || //转接环:接口口径方向一致 item.RingType == enumProductType.Adapter && current != null && current.Find(itmp => itmp.RingType == enumProductType.Adapter && ((this.connectorIDLen[itmp.InterUp] - this.connectorIDLen[itmp.InterDown]) * (this.connectorIDLen[item.InterUp] - this.connectorIDLen[item.InterDown])) < 0).Idx > 0 || //延长环:独立查找,用于找最优 item.RingType == enumProductType.Extend ) { continue; } if (item.InterUp == interUp && item.LengthMin < lengthMax) { current.Add(item); if (item.InterDown == interDown && //调焦环:Xenon-sapphire,xenon-Diamond系列不需要聚焦环,其它至少有一个 (current.Find(itmp => itmp.RingType == enumProductType.Focus).Idx > 0 || lens.Name.StartsWith("Xenon-Diamond") || lens.Name.StartsWith("Xenon Zirconia")) ) { int idxTmp = current.Count; current.Insert(idxTmp, new RingMedium() { InterUp = interDown, Length = 0, LengthMin = 0, LengthMax = 0 }); this.FindAllRingExtend(lens, current, lengthMin - item.LengthMax, lengthMax - item.LengthMin); current.RemoveAt(idxTmp); } else { this.FindAllRing(lens, current, item.InterDown, interDown, lengthMin - item.LengthMax, lengthMax - item.LengthMin, target); } current.Remove(item); } } }
/// <summary> /// 找延长环 /// </summary> /// <param name="lens">镜头</param> /// <param name="focus">调焦环</param> /// <param name="adapter">转接环</param> /// <param name="inter">接口类型</param> /// <param name="minLen">最小长度</param> /// <param name="maxLen">最大长度</param> private void FindExtend(CameraLens lens, RingMedium focus, List <RingMedium> adapter, int inter, float minLen, float maxLen) { if (maxLen <= 0) {//上一层已经结束 this.extendVisitedList.RemoveAt(extendVisitedList.Count - 1); } if (minLen <= 0 && maxLen >= 0) { this.CombinationStruct(lens, focus, adapter, extendVisitedList); } foreach (RingMedium item in this.extendList) { if (item.InterUp == inter && item.Length <= maxLen) { this.extendVisitedList.Add(item); this.FindExtend(lens, focus, adapter, inter, minLen - item.Length, maxLen - item.Length); } } }
private float getRangeLength(CameraLens lens) { float range = 0f; if (lens.Name.StartsWith("Xenon-Diamond")) { range = 16f; } else if (lens.Name.StartsWith("Xenon Zirconia")) { range = 9f; } else if (lens.Name.StartsWith("Xenon Sapphire")) { range = 10f; } return(range); }
/// <summary> /// 找延长环 /// </summary> /// <param name="lens"></param> /// <param name="current"></param> /// <param name="lengthMin"></param> /// <param name="lengthMax"></param> private void FindAllRingExtend(CameraLens lens, List <RingMedium> current, float lengthMin, float lengthMax) { float lengthMid = (lengthMin + lengthMax) / 2.0f; List <List <RingMedium> > allList = new List <List <RingMedium> >(); List <Dictionary <int, int> > diffCountList = new List <Dictionary <int, int> >(); this.FindAllExtend(allList, diffCountList, current, 0, lengthMin, lengthMax); //this.FindAllExtendLast(allList, lengthMin, lengthMax); List <List <RingMedium> > validList = this.FilterBySpecialCondition(allList, lens); // if (this.CombinationStructDataList(lens, validList)) return; //最接近中间值 //List<List<RingMedium>> shortestList = this.SearchShortestExtend(validList, lengthMid); //根据中间值范围过滤 List <List <RingMedium> > shortestList = this.FilterByAdpaterRange(validList, lengthMid, lens); if (this.CombinationStructDataList(lens, shortestList)) { return; } //最长 List <List <RingMedium> > mostLengthList = this.SearchMostLengthExtend(shortestList); if (this.CombinationStructDataList(lens, mostLengthList)) { return; } //最大口径 List <List <RingMedium> > mostWidthList = this.SearchMostWidthExtendSimple(mostLengthList); if (this.CombinationStructDataList(lens, mostWidthList)) { return; } List <List <RingMedium> > resultList = this.FilterRepeatExtend(mostWidthList); this.CombinationStructDataList(lens, resultList, true); }
public ValueType DecodeOneItemByDb(DataRow dr) { CameraLens info = new CameraLens(); info.Idx = Convert.ToInt32(dr["id"]); info.Name = dr["name"].ToString(); info.ImgName = dr["imgName"].ToString(); info.Number = dr["number"].ToString(); info.HH = Convert.ToSingle(dr["hh"]); info.Length = Convert.ToSingle(dr["length"]); info.Focus = Convert.ToSingle(dr["focus"]); info.Flange = Convert.ToSingle(dr["flange"]); info.Connector = Convert.ToInt32(dr["connector"]); info.ResolutionLength = Convert.ToInt32(dr["resoLength"]); info.ResolutionWidth = Convert.ToInt32(dr["resoWidth"]); info.RatioMin = Convert.ToSingle(dr["ratioMin"]); info.RatioMax = Convert.ToSingle(dr["ratioMax"]); info.Weight = Convert.ToInt32(dr["weight"]); info.Contrast = Convert.ToInt32(dr["contrast"]); info.Target = Convert.ToSingle(dr["target"]); info.Distort = Convert.ToInt32(dr["distort"]); return(info); }
private List <List <RingMedium> > FilterByAdpaterRange(List <List <RingMedium> > allList, float length, CameraLens lens) { List <List <RingMedium> > shortestList = new List <List <RingMedium> >(); if (length <= 0) { return(shortestList); } float rangeLength = this.getRangeLength(lens); foreach (List <RingMedium> itemList in allList) { float extLength = -length, mustLength = 0; foreach (RingMedium item in itemList) { extLength += item.RingType == enumProductType.Extend ? item.Length : 0; if (item.RingType == enumProductType.Focus) { rangeLength = rangeLength == 0 ? this.getRangeLength(item) : rangeLength; mustLength = this.getMustExtendLength(item, lens); } } extLength = Math.Abs(extLength); if (length - mustLength >= 0 && extLength <= rangeLength) { shortestList.Add(itemList); } } return(shortestList); }
private List <List <RingMedium> > FilterBySpecialCondition(List <List <RingMedium> > allList, CameraLens lens) { bool focus23Flag = false, focus7Flag = false, extend25Flag = false, extend10Flag = false, lens120Flag = false; if (lens.Name.Contains("5.6/120")) { lens120Flag = true; } List <List <RingMedium> > validList = new List <List <RingMedium> >(); foreach (List <RingMedium> itemList in allList) { focus23Flag = false; focus7Flag = false; extend25Flag = false; extend10Flag = false; foreach (RingMedium item in itemList) { if (item.RingType == enumProductType.Focus && item.Name == "Smart Focus 23") { focus23Flag = true; } else if (item.RingType == enumProductType.Focus && item.Name == "Smart Focus 7") { focus7Flag = true; } else if (item.RingType == enumProductType.Extend && item.Number == "20179A") { extend25Flag = true; } else if (item.RingType == enumProductType.Extend && item.Number == "20178A") { extend10Flag = true; } } if (focus23Flag && lens120Flag && extend25Flag || focus23Flag && !lens120Flag && extend10Flag || focus7Flag && lens120Flag && extend25Flag || focus7Flag && !lens120Flag || !focus23Flag && !focus7Flag) { validList.Add(itemList); } } return(validList); }